[HarfBuzz] harfbuzz: Branch 'master' - 11 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Fri Jun 20 15:00:11 PDT 2014


 src/Makefile.am                         |    2 
 src/gen-arabic-table.py                 |  150 ++++--
 src/gen-indic-table.py                  |   58 +-
 src/hb-ot-shape-complex-arabic-table.hh |  793 +++-----------------------------
 src/hb-ot-shape-complex-arabic.cc       |    8 
 src/hb-ot-shape-complex-indic-table.cc  |  317 ++++--------
 6 files changed, 345 insertions(+), 983 deletions(-)

New commits:
commit b900fa2c8cc088dbcbdbf90bfdf8764f9ee1c96a
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Jun 20 17:59:43 2014 -0400

    [arabic-table] Use segmented table
    
    No functional change.

diff --git a/src/gen-arabic-table.py b/src/gen-arabic-table.py
index 6f2c9d5..1596126 100755
--- a/src/gen-arabic-table.py
+++ b/src/gen-arabic-table.py
@@ -71,42 +71,76 @@ def print_joining_table(f):
 	for value,short in short_value.items():
 		print "#define %s	%s" % (short, value)
 
-	keys = values.keys()
-	min_u = min(keys)
-	max_u = max(keys)
+	uu = sorted(values.keys())
 	num = len(values)
+
+	last = -1
+	ranges = []
+	for u in uu:
+		if u - last <= 1+16*3:
+			ranges[-1][-1] = u
+		else:
+			ranges.append([u,u])
+		last = u
+
 	print
 	print "static const uint8_t joining_table[] ="
 	print "{"
 	last_block = None
-	for u in range(min_u, max_u+1):
+	offset = 0
+	for start,end in ranges:
+
+		print
+		print "#define joining_offset_0x%04x %d" % (start, offset)
+
+		for u in range(start, end+1):
+
+			block = blocks.get(u, last_block)
+			value = values.get(u, "JOINING_TYPE_X")
 
-		value = values.get(u, "JOINING_TYPE_X")
+			if block != last_block or u == start:
+				if u != start:
+					print
+				print "\n  /* %s */" % block
+				last_block = block
+				if u % 32 != 0:
+					print
+					print "  /* %04X */" % (u//32*32), "  " * (u % 32),
 
-		block = blocks.get(u, last_block)
-		if block != last_block:
-			print "\n\n  /* %s */" % block
-			last_block = block
-			if u % 32 != 0:
+			if u % 32 == 0:
 				print
-				print "  /* %04X */" % u, "  " * (u % 32),
+				print "  /* %04X */ " % u,
+			sys.stdout.write("%s," % short_value[value])
+		print
 
-		if u % 32 == 0:
-			print
-			print "  /* %04X */ " % u,
-		sys.stdout.write("%s," % short_value[value])
+		offset += end - start + 1
 	print
-	print "};"
-	print
-	print "#define JOINING_TABLE_FIRST	0x%04X" % min_u
-	print "#define JOINING_TABLE_LAST	0x%04X" % max_u
+	occupancy = num * 100. / offset
+	print "}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy)
 	print
 
-	occupancy = num * 100 / (max_u - min_u + 1)
-	# Maintain at least 40% occupancy in the table */
-	if occupancy < 40:
-		raise Exception ("Table too sparse, please investigate: ", occupancy)
-
+	page_bits = 8
+	print
+	print "static unsigned int"
+	print "joining_type (hb_codepoint_t u)"
+	print "{"
+	print "  switch (u >> %d)" % page_bits
+	print "  {"
+	pages = set([u>>page_bits for u in [s for s,e in ranges]+[e for s,e in ranges]])
+	for p in sorted(pages):
+		print "    case 0x%0X:" % p
+		for (start,end) in ranges:
+			if p not in [start>>page_bits, end>>page_bits]: continue
+			offset = "joining_offset_0x%04x" % start
+			print "      if (0x%04X <= u && u <= 0x%04X) return joining_table[u - 0x%04X + %s];" % (start, end, start, offset)
+		print "      break;"
+		print ""
+	print "    default:"
+	print "      break;"
+	print "  }"
+	print "  return X;"
+	print "}"
+	print
 	for value,short in short_value.items():
 		print "#undef %s" % (short)
 	print
diff --git a/src/hb-ot-shape-complex-arabic-table.hh b/src/hb-ot-shape-complex-arabic-table.hh
index ad119da..877625a 100644
--- a/src/hb-ot-shape-complex-arabic-table.hh
+++ b/src/hb-ot-shape-complex-arabic-table.hh
@@ -28,6 +28,7 @@
 static const uint8_t joining_table[] =
 {
 
+#define joining_offset_0x0600 0
 
   /* Arabic */
 
@@ -48,37 +49,55 @@ static const uint8_t joining_table[] =
 
   /* Arabic Supplement */
 
-  /* 0750 */                                 D,D,D,D,D,D,D,D,D,R,R,R,D,D,D,D,
+  /* 0740 */                                 D,D,D,D,D,D,D,D,D,R,R,R,D,D,D,D,
   /* 0760 */ D,D,D,D,D,D,D,D,D,D,D,R,R,D,D,D,D,R,D,R,R,D,D,D,R,R,D,D,D,D,D,D,
 
-  /* Thaana */
-
-  /* 0780 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
-  /* 07A0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+#define joining_offset_0x07ca 384
 
   /* NKo */
 
-  /* 07C0 */ X,X,X,X,X,X,X,X,X,X,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
-  /* 07E0 */ D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,C,X,X,X,X,X,
-
-  /* Samaritan */
+  /* 07C0 */                     D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+  /* 07E0 */ D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,C,
 
-  /* 0800 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
-  /* 0820 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+#define joining_offset_0x0840 433
 
   /* Mandaic */
 
-  /* 0840 */ R,D,D,D,D,D,R,D,D,R,D,D,D,D,D,R,D,D,D,D,R,D,U,U,U,X,X,X,X,X,X,X,
-  /* 0860 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
-  /* 0880 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0840 */ R,D,D,D,D,D,R,D,D,R,D,D,D,D,D,R,D,D,D,D,R,D,U,U,U,
+
+#define joining_offset_0x08a0 458
 
   /* Arabic Extended-A */
 
   /* 08A0 */ D,X,D,D,D,D,D,D,D,D,R,R,R,
-};
 
-#define JOINING_TABLE_FIRST	0x0600
-#define JOINING_TABLE_LAST	0x08AC
+}; /* Table items: 471; occupancy: 66% */
+
+
+static unsigned int
+joining_type (hb_codepoint_t u)
+{
+  switch (u >> 8)
+  {
+    case 0x6:
+      if (0x0600 <= u && u <= 0x077F) return joining_table[u - 0x0600 + joining_offset_0x0600];
+      break;
+
+    case 0x7:
+      if (0x0600 <= u && u <= 0x077F) return joining_table[u - 0x0600 + joining_offset_0x0600];
+      if (0x07CA <= u && u <= 0x07FA) return joining_table[u - 0x07CA + joining_offset_0x07ca];
+      break;
+
+    case 0x8:
+      if (0x0840 <= u && u <= 0x0858) return joining_table[u - 0x0840 + joining_offset_0x0840];
+      if (0x08A0 <= u && u <= 0x08AC) return joining_table[u - 0x08A0 + joining_offset_0x08a0];
+      break;
+
+    default:
+      break;
+  }
+  return X;
+}
 
 #undef X
 #undef R
diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc
index ea6d85c..61a55ef 100644
--- a/src/hb-ot-shape-complex-arabic.cc
+++ b/src/hb-ot-shape-complex-arabic.cc
@@ -57,11 +57,9 @@ enum {
 
 static unsigned int get_joining_type (hb_codepoint_t u, hb_unicode_general_category_t gen_cat)
 {
-  if (likely (hb_in_range<hb_codepoint_t> (u, JOINING_TABLE_FIRST, JOINING_TABLE_LAST))) {
-    unsigned int j_type = joining_table[u - JOINING_TABLE_FIRST];
-    if (likely (j_type != JOINING_TYPE_X))
-      return j_type;
-  }
+  unsigned int j_type = joining_type(u);
+  if (likely (j_type != JOINING_TYPE_X))
+    return j_type;
 
   /* Mongolian joining data is not in ArabicJoining.txt yet. */
   if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x1800, 0x18AF)))
commit c2e113404640bf9b8bac469d0803ac946e77964f
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Jun 20 17:57:03 2014 -0400

    [indic-table] Make output stable

diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py
index c1b0d6e..4630a10 100755
--- a/src/gen-indic-table.py
+++ b/src/gen-indic-table.py
@@ -195,7 +195,7 @@ print "{"
 print "  switch (u >> 12)"
 print "  {"
 pages = set([u>>12 for u in starts+ends+singles.keys()])
-for p in pages:
+for p in sorted(pages):
 	print "    case 0x%0X:" % p
 	for (start,end) in zip (starts, ends):
 		if p not in [start>>12, end>>12]: continue
commit 55abfbd2ac1626af16151298a0837b837d0796df
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Jun 20 16:47:43 2014 -0400

    [indic-table] Minor
    
    No output change.

diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py
index 10e4579..c1b0d6e 100755
--- a/src/gen-indic-table.py
+++ b/src/gen-indic-table.py
@@ -12,7 +12,6 @@ files = [file (x) for x in sys.argv[1:]]
 
 headers = [[f.readline () for i in range (2)] for f in files]
 
-blocks = {}
 data = [{} for f in files]
 values = [{} for f in files]
 for i, f in enumerate (files):
@@ -39,9 +38,6 @@ for i, f in enumerate (files):
 			data[i][u] = t
 		values[i][t] = values[i].get (t, 0) + 1
 
-		if i == 2:
-			blocks[t] = (start, end)
-
 # Merge data into one dict:
 defaults = ('Other', 'Not_Applicable', 'No_Block')
 for i,v in enumerate (defaults):
@@ -164,11 +160,10 @@ for u in uu:
 	if u <= last:
 		continue
 	block = data[u][2]
-	(bstart, bend) = blocks[block]
 
 	start = u//8*8
 	end = start+1
-	while end < bend and end in uu:
+	while end in uu and block == data[end][2]:
 		end += 1
 	end = (end-1)//8*8 + 7
 
commit f88670749006991282bcc4e8b6218487295ca670
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Jun 20 16:30:10 2014 -0400

    [arabic-table] Don't write comments
    
    No functional change.

diff --git a/src/gen-arabic-table.py b/src/gen-arabic-table.py
index 28f10f7..6f2c9d5 100755
--- a/src/gen-arabic-table.py
+++ b/src/gen-arabic-table.py
@@ -59,10 +59,10 @@ def print_joining_table(f):
 			value = "JOINING_GROUP_" + fields[3].replace(' ', '_')
 		else:
 			value = "JOINING_TYPE_" + fields[2]
-		values[u] = (value, fields)
+		values[u] = value
 
 	short_value = {}
-	for value in set([v[0] for v in values.values()] + ['JOINING_TYPE_X']):
+	for value in set([v for v in values.values()] + ['JOINING_TYPE_X']):
 		short = ''.join(x[0] for x in value.split('_')[2:])
 		assert short not in short_value.values()
 		short_value[value] = short
@@ -80,13 +80,21 @@ def print_joining_table(f):
 	print "{"
 	last_block = None
 	for u in range(min_u, max_u+1):
-		value,fields = values.get(u, ("JOINING_TYPE_X", ["%04X"%u]))
+
+		value = values.get(u, "JOINING_TYPE_X")
+
 		block = blocks.get(u, last_block)
 		if block != last_block:
-			print "\n  /* %s */\n" % block
+			print "\n\n  /* %s */" % block
 			last_block = block
-
-		print "  %s, /* %s */" % (short_value[value], '; '.join(fields))
+			if u % 32 != 0:
+				print
+				print "  /* %04X */" % u, "  " * (u % 32),
+
+		if u % 32 == 0:
+			print
+			print "  /* %04X */ " % u,
+		sys.stdout.write("%s," % short_value[value])
 	print
 	print "};"
 	print
diff --git a/src/hb-ot-shape-complex-arabic-table.hh b/src/hb-ot-shape-complex-arabic-table.hh
index 579de89..ad119da 100644
--- a/src/hb-ot-shape-complex-arabic-table.hh
+++ b/src/hb-ot-shape-complex-arabic-table.hh
@@ -28,715 +28,53 @@
 static const uint8_t joining_table[] =
 {
 
+
   /* Arabic */
 
-  U, /* 0600; ARABIC NUMBER SIGN; U; No_Joining_Group */
-  U, /* 0601; ARABIC SIGN SANAH; U; No_Joining_Group */
-  U, /* 0602; ARABIC FOOTNOTE MARKER; U; No_Joining_Group */
-  U, /* 0603; ARABIC SIGN SAFHA; U; No_Joining_Group */
-  U, /* 0604; ARABIC SIGN SAMVAT; U; No_Joining_Group */
-  X, /* 0605 */
-  X, /* 0606 */
-  X, /* 0607 */
-  U, /* 0608; ARABIC RAY; U; No_Joining_Group */
-  X, /* 0609 */
-  X, /* 060A */
-  U, /* 060B; AFGHANI SIGN; U; No_Joining_Group */
-  X, /* 060C */
-  X, /* 060D */
-  X, /* 060E */
-  X, /* 060F */
-  X, /* 0610 */
-  X, /* 0611 */
-  X, /* 0612 */
-  X, /* 0613 */
-  X, /* 0614 */
-  X, /* 0615 */
-  X, /* 0616 */
-  X, /* 0617 */
-  X, /* 0618 */
-  X, /* 0619 */
-  X, /* 061A */
-  X, /* 061B */
-  X, /* 061C */
-  X, /* 061D */
-  X, /* 061E */
-  X, /* 061F */
-  D, /* 0620; DOTLESS YEH WITH SEPARATE RING BELOW; D; YEH */
-  U, /* 0621; HAMZA; U; No_Joining_Group */
-  R, /* 0622; ALEF WITH MADDA ABOVE; R; ALEF */
-  R, /* 0623; ALEF WITH HAMZA ABOVE; R; ALEF */
-  R, /* 0624; WAW WITH HAMZA ABOVE; R; WAW */
-  R, /* 0625; ALEF WITH HAMZA BELOW; R; ALEF */
-  D, /* 0626; DOTLESS YEH WITH HAMZA ABOVE; D; YEH */
-  R, /* 0627; ALEF; R; ALEF */
-  D, /* 0628; BEH; D; BEH */
-  R, /* 0629; TEH MARBUTA; R; TEH MARBUTA */
-  D, /* 062A; DOTLESS BEH WITH 2 DOTS ABOVE; D; BEH */
-  D, /* 062B; DOTLESS BEH WITH 3 DOTS ABOVE; D; BEH */
-  D, /* 062C; HAH WITH DOT BELOW; D; HAH */
-  D, /* 062D; HAH; D; HAH */
-  D, /* 062E; HAH WITH DOT ABOVE; D; HAH */
-  R, /* 062F; DAL; R; DAL */
-  R, /* 0630; DAL WITH DOT ABOVE; R; DAL */
-  R, /* 0631; REH; R; REH */
-  R, /* 0632; REH WITH DOT ABOVE; R; REH */
-  D, /* 0633; SEEN; D; SEEN */
-  D, /* 0634; SEEN WITH 3 DOTS ABOVE; D; SEEN */
-  D, /* 0635; SAD; D; SAD */
-  D, /* 0636; SAD WITH DOT ABOVE; D; SAD */
-  D, /* 0637; TAH; D; TAH */
-  D, /* 0638; TAH WITH DOT ABOVE; D; TAH */
-  D, /* 0639; AIN; D; AIN */
-  D, /* 063A; AIN WITH DOT ABOVE; D; AIN */
-  D, /* 063B; KEHEH WITH 2 DOTS ABOVE; D; GAF */
-  D, /* 063C; KEHEH WITH 3 DOTS BELOW; D; GAF */
-  D, /* 063D; FARSI YEH WITH INVERTED V ABOVE; D; FARSI YEH */
-  D, /* 063E; FARSI YEH WITH 2 DOTS ABOVE; D; FARSI YEH */
-  D, /* 063F; FARSI YEH WITH 3 DOTS ABOVE; D; FARSI YEH */
-  C, /* 0640; TATWEEL; C; No_Joining_Group */
-  D, /* 0641; FEH; D; FEH */
-  D, /* 0642; QAF; D; QAF */
-  D, /* 0643; KAF; D; KAF */
-  D, /* 0644; LAM; D; LAM */
-  D, /* 0645; MEEM; D; MEEM */
-  D, /* 0646; NOON; D; NOON */
-  D, /* 0647; HEH; D; HEH */
-  R, /* 0648; WAW; R; WAW */
-  D, /* 0649; DOTLESS YEH; D; YEH */
-  D, /* 064A; YEH; D; YEH */
-  X, /* 064B */
-  X, /* 064C */
-  X, /* 064D */
-  X, /* 064E */
-  X, /* 064F */
-  X, /* 0650 */
-  X, /* 0651 */
-  X, /* 0652 */
-  X, /* 0653 */
-  X, /* 0654 */
-  X, /* 0655 */
-  X, /* 0656 */
-  X, /* 0657 */
-  X, /* 0658 */
-  X, /* 0659 */
-  X, /* 065A */
-  X, /* 065B */
-  X, /* 065C */
-  X, /* 065D */
-  X, /* 065E */
-  X, /* 065F */
-  X, /* 0660 */
-  X, /* 0661 */
-  X, /* 0662 */
-  X, /* 0663 */
-  X, /* 0664 */
-  X, /* 0665 */
-  X, /* 0666 */
-  X, /* 0667 */
-  X, /* 0668 */
-  X, /* 0669 */
-  X, /* 066A */
-  X, /* 066B */
-  X, /* 066C */
-  X, /* 066D */
-  D, /* 066E; DOTLESS BEH; D; BEH */
-  D, /* 066F; DOTLESS QAF; D; QAF */
-  X, /* 0670 */
-  R, /* 0671; ALEF WITH WASLA ABOVE; R; ALEF */
-  R, /* 0672; ALEF WITH WAVY HAMZA ABOVE; R; ALEF */
-  R, /* 0673; ALEF WITH WAVY HAMZA BELOW; R; ALEF */
-  U, /* 0674; HIGH HAMZA; U; No_Joining_Group */
-  R, /* 0675; HIGH HAMZA ALEF; R; ALEF */
-  R, /* 0676; HIGH HAMZA WAW; R; WAW */
-  R, /* 0677; HIGH HAMZA WAW WITH DAMMA ABOVE; R; WAW */
-  D, /* 0678; HIGH HAMZA DOTLESS YEH; D; YEH */
-  D, /* 0679; DOTLESS BEH WITH TAH ABOVE; D; BEH */
-  D, /* 067A; DOTLESS BEH WITH VERTICAL 2 DOTS ABOVE; D; BEH */
-  D, /* 067B; DOTLESS BEH WITH VERTICAL 2 DOTS BELOW; D; BEH */
-  D, /* 067C; DOTLESS BEH WITH ATTACHED RING BELOW AND 2 DOTS ABOVE; D; BEH */
-  D, /* 067D; DOTLESS BEH WITH INVERTED 3 DOTS ABOVE; D; BEH */
-  D, /* 067E; DOTLESS BEH WITH 3 DOTS BELOW; D; BEH */
-  D, /* 067F; DOTLESS BEH WITH 4 DOTS ABOVE; D; BEH */
-  D, /* 0680; DOTLESS BEH WITH 4 DOTS BELOW; D; BEH */
-  D, /* 0681; HAH WITH HAMZA ABOVE; D; HAH */
-  D, /* 0682; HAH WITH VERTICAL 2 DOTS ABOVE; D; HAH */
-  D, /* 0683; HAH WITH 2 DOTS BELOW; D; HAH */
-  D, /* 0684; HAH WITH VERTICAL 2 DOTS BELOW; D; HAH */
-  D, /* 0685; HAH WITH 3 DOTS ABOVE; D; HAH */
-  D, /* 0686; HAH WITH 3 DOTS BELOW; D; HAH */
-  D, /* 0687; HAH WITH 4 DOTS BELOW; D; HAH */
-  R, /* 0688; DAL WITH TAH ABOVE; R; DAL */
-  R, /* 0689; DAL WITH ATTACHED RING BELOW; R; DAL */
-  R, /* 068A; DAL WITH DOT BELOW; R; DAL */
-  R, /* 068B; DAL WITH DOT BELOW AND TAH ABOVE; R; DAL */
-  R, /* 068C; DAL WITH 2 DOTS ABOVE; R; DAL */
-  R, /* 068D; DAL WITH 2 DOTS BELOW; R; DAL */
-  R, /* 068E; DAL WITH 3 DOTS ABOVE; R; DAL */
-  R, /* 068F; DAL WITH INVERTED 3 DOTS ABOVE; R; DAL */
-  R, /* 0690; DAL WITH 4 DOTS ABOVE; R; DAL */
-  R, /* 0691; REH WITH TAH ABOVE; R; REH */
-  R, /* 0692; REH WITH V ABOVE; R; REH */
-  R, /* 0693; REH WITH ATTACHED RING BELOW; R; REH */
-  R, /* 0694; REH WITH DOT BELOW; R; REH */
-  R, /* 0695; REH WITH V BELOW; R; REH */
-  R, /* 0696; REH WITH DOT BELOW AND DOT WITHIN; R; REH */
-  R, /* 0697; REH WITH 2 DOTS ABOVE; R; REH */
-  R, /* 0698; REH WITH 3 DOTS ABOVE; R; REH */
-  R, /* 0699; REH WITH 4 DOTS ABOVE; R; REH */
-  D, /* 069A; SEEN WITH DOT BELOW AND DOT ABOVE; D; SEEN */
-  D, /* 069B; SEEN WITH 3 DOTS BELOW; D; SEEN */
-  D, /* 069C; SEEN WITH 3 DOTS BELOW AND 3 DOTS ABOVE; D; SEEN */
-  D, /* 069D; SAD WITH 2 DOTS BELOW; D; SAD */
-  D, /* 069E; SAD WITH 3 DOTS ABOVE; D; SAD */
-  D, /* 069F; TAH WITH 3 DOTS ABOVE; D; TAH */
-  D, /* 06A0; AIN WITH 3 DOTS ABOVE; D; AIN */
-  D, /* 06A1; DOTLESS FEH; D; FEH */
-  D, /* 06A2; DOTLESS FEH WITH DOT BELOW; D; FEH */
-  D, /* 06A3; FEH WITH DOT BELOW; D; FEH */
-  D, /* 06A4; DOTLESS FEH WITH 3 DOTS ABOVE; D; FEH */
-  D, /* 06A5; DOTLESS FEH WITH 3 DOTS BELOW; D; FEH */
-  D, /* 06A6; DOTLESS FEH WITH 4 DOTS ABOVE; D; FEH */
-  D, /* 06A7; DOTLESS QAF WITH DOT ABOVE; D; QAF */
-  D, /* 06A8; DOTLESS QAF WITH 3 DOTS ABOVE; D; QAF */
-  D, /* 06A9; KEHEH; D; GAF */
-  D, /* 06AA; SWASH KAF; D; SWASH KAF */
-  D, /* 06AB; KEHEH WITH ATTACHED RING BELOW; D; GAF */
-  D, /* 06AC; KAF WITH DOT ABOVE; D; KAF */
-  D, /* 06AD; KAF WITH 3 DOTS ABOVE; D; KAF */
-  D, /* 06AE; KAF WITH 3 DOTS BELOW; D; KAF */
-  D, /* 06AF; GAF; D; GAF */
-  D, /* 06B0; GAF WITH ATTACHED RING BELOW; D; GAF */
-  D, /* 06B1; GAF WITH 2 DOTS ABOVE; D; GAF */
-  D, /* 06B2; GAF WITH 2 DOTS BELOW; D; GAF */
-  D, /* 06B3; GAF WITH VERTICAL 2 DOTS BELOW; D; GAF */
-  D, /* 06B4; GAF WITH 3 DOTS ABOVE; D; GAF */
-  D, /* 06B5; LAM WITH V ABOVE; D; LAM */
-  D, /* 06B6; LAM WITH DOT ABOVE; D; LAM */
-  D, /* 06B7; LAM WITH 3 DOTS ABOVE; D; LAM */
-  D, /* 06B8; LAM WITH 3 DOTS BELOW; D; LAM */
-  D, /* 06B9; NOON WITH DOT BELOW; D; NOON */
-  D, /* 06BA; DOTLESS NOON; D; NOON */
-  D, /* 06BB; DOTLESS NOON WITH TAH ABOVE; D; NOON */
-  D, /* 06BC; NOON WITH ATTACHED RING BELOW; D; NOON */
-  D, /* 06BD; NYA; D; NYA */
-  D, /* 06BE; KNOTTED HEH; D; KNOTTED HEH */
-  D, /* 06BF; HAH WITH 3 DOTS BELOW AND DOT ABOVE; D; HAH */
-  R, /* 06C0; DOTLESS TEH MARBUTA WITH HAMZA ABOVE; R; TEH MARBUTA */
-  D, /* 06C1; HEH GOAL; D; HEH GOAL */
-  D, /* 06C2; HEH GOAL WITH HAMZA ABOVE; D; HEH GOAL */
-  R, /* 06C3; TEH MARBUTA GOAL; R; TEH MARBUTA GOAL */
-  R, /* 06C4; WAW WITH ATTACHED RING WITHIN; R; WAW */
-  R, /* 06C5; WAW WITH BAR; R; WAW */
-  R, /* 06C6; WAW WITH V ABOVE; R; WAW */
-  R, /* 06C7; WAW WITH DAMMA ABOVE; R; WAW */
-  R, /* 06C8; WAW WITH ALEF ABOVE; R; WAW */
-  R, /* 06C9; WAW WITH INVERTED V ABOVE; R; WAW */
-  R, /* 06CA; WAW WITH 2 DOTS ABOVE; R; WAW */
-  R, /* 06CB; WAW WITH 3 DOTS ABOVE; R; WAW */
-  D, /* 06CC; FARSI YEH; D; FARSI YEH */
-  R, /* 06CD; YEH WITH TAIL; R; YEH WITH TAIL */
-  D, /* 06CE; FARSI YEH WITH V ABOVE; D; FARSI YEH */
-  R, /* 06CF; WAW WITH DOT ABOVE; R; WAW */
-  D, /* 06D0; DOTLESS YEH WITH VERTICAL 2 DOTS BELOW; D; YEH */
-  D, /* 06D1; DOTLESS YEH WITH 3 DOTS BELOW; D; YEH */
-  R, /* 06D2; YEH BARREE; R; YEH BARREE */
-  R, /* 06D3; YEH BARREE WITH HAMZA ABOVE; R; YEH BARREE */
-  X, /* 06D4 */
-  R, /* 06D5; DOTLESS TEH MARBUTA; R; TEH MARBUTA */
-  X, /* 06D6 */
-  X, /* 06D7 */
-  X, /* 06D8 */
-  X, /* 06D9 */
-  X, /* 06DA */
-  X, /* 06DB */
-  X, /* 06DC */
-  U, /* 06DD; ARABIC END OF AYAH; U; No_Joining_Group */
-  X, /* 06DE */
-  X, /* 06DF */
-  X, /* 06E0 */
-  X, /* 06E1 */
-  X, /* 06E2 */
-  X, /* 06E3 */
-  X, /* 06E4 */
-  X, /* 06E5 */
-  X, /* 06E6 */
-  X, /* 06E7 */
-  X, /* 06E8 */
-  X, /* 06E9 */
-  X, /* 06EA */
-  X, /* 06EB */
-  X, /* 06EC */
-  X, /* 06ED */
-  R, /* 06EE; DAL WITH INVERTED V ABOVE; R; DAL */
-  R, /* 06EF; REH WITH INVERTED V ABOVE; R; REH */
-  X, /* 06F0 */
-  X, /* 06F1 */
-  X, /* 06F2 */
-  X, /* 06F3 */
-  X, /* 06F4 */
-  X, /* 06F5 */
-  X, /* 06F6 */
-  X, /* 06F7 */
-  X, /* 06F8 */
-  X, /* 06F9 */
-  D, /* 06FA; SEEN WITH DOT BELOW AND 3 DOTS ABOVE; D; SEEN */
-  D, /* 06FB; SAD WITH DOT BELOW AND DOT ABOVE; D; SAD */
-  D, /* 06FC; AIN WITH DOT BELOW AND DOT ABOVE; D; AIN */
-  X, /* 06FD */
-  X, /* 06FE */
-  D, /* 06FF; KNOTTED HEH WITH INVERTED V ABOVE; D; KNOTTED HEH */
+  /* 0600 */ U,U,U,U,U,X,X,X,U,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0620 */ D,U,R,R,R,R,D,R,D,R,D,D,D,D,D,R,R,R,R,D,D,D,D,D,D,D,D,D,D,D,D,D,
+  /* 0640 */ C,D,D,D,D,D,D,D,R,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0660 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,D,D,X,R,R,R,U,R,R,R,D,D,D,D,D,D,D,D,
+  /* 0680 */ D,D,D,D,D,D,D,D,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,D,D,D,D,D,D,
+  /* 06A0 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+  /* 06C0 */ R,D,D,R,R,R,R,R,R,R,R,R,D,R,D,R,D,D,R,R,X,R,X,X,X,X,X,X,X,U,X,X,
+  /* 06E0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,R,R,X,X,X,X,X,X,X,X,X,X,D,D,D,X,X,D,
 
   /* Syriac */
 
-  X, /* 0700 */
-  X, /* 0701 */
-  X, /* 0702 */
-  X, /* 0703 */
-  X, /* 0704 */
-  X, /* 0705 */
-  X, /* 0706 */
-  X, /* 0707 */
-  X, /* 0708 */
-  X, /* 0709 */
-  X, /* 070A */
-  X, /* 070B */
-  X, /* 070C */
-  X, /* 070D */
-  X, /* 070E */
-  X, /* 070F */
-  A, /* 0710; ALAPH; R; ALAPH */
-  X, /* 0711 */
-  D, /* 0712; BETH; D; BETH */
-  D, /* 0713; GAMAL; D; GAMAL */
-  D, /* 0714; GAMAL GARSHUNI; D; GAMAL */
-  DR, /* 0715; DALATH; R; DALATH RISH */
-  DR, /* 0716; DOTLESS DALATH RISH; R; DALATH RISH */
-  R, /* 0717; HE; R; HE */
-  R, /* 0718; WAW; R; SYRIAC WAW */
-  R, /* 0719; ZAIN; R; ZAIN */
-  D, /* 071A; HETH; D; HETH */
-  D, /* 071B; TETH; D; TETH */
-  D, /* 071C; TETH GARSHUNI; D; TETH */
-  D, /* 071D; YUDH; D; YUDH */
-  R, /* 071E; YUDH HE; R; YUDH HE */
-  D, /* 071F; KAPH; D; KAPH */
-  D, /* 0720; LAMADH; D; LAMADH */
-  D, /* 0721; MIM; D; MIM */
-  D, /* 0722; NUN; D; NUN */
-  D, /* 0723; SEMKATH; D; SEMKATH */
-  D, /* 0724; FINAL SEMKATH; D; FINAL SEMKATH */
-  D, /* 0725; E; D; E */
-  D, /* 0726; PE; D; PE */
-  D, /* 0727; REVERSED PE; D; REVERSED PE */
-  R, /* 0728; SADHE; R; SADHE */
-  D, /* 0729; QAPH; D; QAPH */
-  DR, /* 072A; RISH; R; DALATH RISH */
-  D, /* 072B; SHIN; D; SHIN */
-  R, /* 072C; TAW; R; TAW */
-  D, /* 072D; PERSIAN BHETH; D; BETH */
-  D, /* 072E; PERSIAN GHAMAL; D; GAMAL */
-  DR, /* 072F; PERSIAN DHALATH; R; DALATH RISH */
-  X, /* 0730 */
-  X, /* 0731 */
-  X, /* 0732 */
-  X, /* 0733 */
-  X, /* 0734 */
-  X, /* 0735 */
-  X, /* 0736 */
-  X, /* 0737 */
-  X, /* 0738 */
-  X, /* 0739 */
-  X, /* 073A */
-  X, /* 073B */
-  X, /* 073C */
-  X, /* 073D */
-  X, /* 073E */
-  X, /* 073F */
-  X, /* 0740 */
-  X, /* 0741 */
-  X, /* 0742 */
-  X, /* 0743 */
-  X, /* 0744 */
-  X, /* 0745 */
-  X, /* 0746 */
-  X, /* 0747 */
-  X, /* 0748 */
-  X, /* 0749 */
-  X, /* 074A */
-  X, /* 074B */
-  X, /* 074C */
-  R, /* 074D; SOGDIAN ZHAIN; R; ZHAIN */
-  D, /* 074E; SOGDIAN KHAPH; D; KHAPH */
-  D, /* 074F; SOGDIAN FE; D; FE */
+  /* 0700 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,A,X,D,D,D,DR,DR,R,R,R,D,D,D,D,R,D,
+  /* 0720 */ D,D,D,D,D,D,D,D,R,D,DR,D,R,D,D,DR,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0740 */ X,X,X,X,X,X,X,X,X,X,X,X,X,R,D,D,
 
   /* Arabic Supplement */
 
-  D, /* 0750; DOTLESS BEH WITH HORIZONTAL 3 DOTS BELOW; D; BEH */
-  D, /* 0751; BEH WITH 3 DOTS ABOVE; D; BEH */
-  D, /* 0752; DOTLESS BEH WITH INVERTED 3 DOTS BELOW; D; BEH */
-  D, /* 0753; DOTLESS BEH WITH INVERTED 3 DOTS BELOW AND 2 DOTS ABOVE; D; BEH */
-  D, /* 0754; DOTLESS BEH WITH 2 DOTS BELOW AND DOT ABOVE; D; BEH */
-  D, /* 0755; DOTLESS BEH WITH INVERTED V BELOW; D; BEH */
-  D, /* 0756; DOTLESS BEH WITH V ABOVE; D; BEH */
-  D, /* 0757; HAH WITH 2 DOTS ABOVE; D; HAH */
-  D, /* 0758; HAH WITH INVERTED 3 DOTS BELOW; D; HAH */
-  R, /* 0759; DAL WITH VERTICAL 2 DOTS BELOW AND TAH ABOVE; R; DAL */
-  R, /* 075A; DAL WITH INVERTED V BELOW; R; DAL */
-  R, /* 075B; REH WITH BAR; R; REH */
-  D, /* 075C; SEEN WITH 4 DOTS ABOVE; D; SEEN */
-  D, /* 075D; AIN WITH 2 DOTS ABOVE; D; AIN */
-  D, /* 075E; AIN WITH INVERTED 3 DOTS ABOVE; D; AIN */
-  D, /* 075F; AIN WITH VERTICAL 2 DOTS ABOVE; D; AIN */
-  D, /* 0760; DOTLESS FEH WITH 2 DOTS BELOW; D; FEH */
-  D, /* 0761; DOTLESS FEH WITH INVERTED 3 DOTS BELOW; D; FEH */
-  D, /* 0762; KEHEH WITH DOT ABOVE; D; GAF */
-  D, /* 0763; KEHEH WITH 3 DOTS ABOVE; D; GAF */
-  D, /* 0764; KEHEH WITH INVERTED 3 DOTS BELOW; D; GAF */
-  D, /* 0765; MEEM WITH DOT ABOVE; D; MEEM */
-  D, /* 0766; MEEM WITH DOT BELOW; D; MEEM */
-  D, /* 0767; NOON WITH 2 DOTS BELOW; D; NOON */
-  D, /* 0768; NOON WITH TAH ABOVE; D; NOON */
-  D, /* 0769; NOON WITH V ABOVE; D; NOON */
-  D, /* 076A; LAM WITH BAR; D; LAM */
-  R, /* 076B; REH WITH VERTICAL 2 DOTS ABOVE; R; REH */
-  R, /* 076C; REH WITH HAMZA ABOVE; R; REH */
-  D, /* 076D; SEEN WITH VERTICAL 2 DOTS ABOVE; D; SEEN */
-  D, /* 076E; HAH WITH TAH BELOW; D; HAH */
-  D, /* 076F; HAH WITH TAH AND 2 DOTS BELOW; D; HAH */
-  D, /* 0770; SEEN WITH 2 DOTS AND TAH ABOVE; D; SEEN */
-  R, /* 0771; REH WITH 2 DOTS AND TAH ABOVE; R; REH */
-  D, /* 0772; HAH WITH TAH ABOVE; D; HAH */
-  R, /* 0773; ALEF WITH DIGIT TWO ABOVE; R; ALEF */
-  R, /* 0774; ALEF WITH DIGIT THREE ABOVE; R; ALEF */
-  D, /* 0775; FARSI YEH WITH DIGIT TWO ABOVE; D; FARSI YEH */
-  D, /* 0776; FARSI YEH WITH DIGIT THREE ABOVE; D; FARSI YEH */
-  D, /* 0777; DOTLESS YEH WITH DIGIT FOUR BELOW; D; YEH */
-  R, /* 0778; WAW WITH DIGIT TWO ABOVE; R; WAW */
-  R, /* 0779; WAW WITH DIGIT THREE ABOVE; R; WAW */
-  D, /* 077A; BURUSHASKI YEH BARREE WITH DIGIT TWO ABOVE; D; BURUSHASKI YEH BARREE */
-  D, /* 077B; BURUSHASKI YEH BARREE WITH DIGIT THREE ABOVE; D; BURUSHASKI YEH BARREE */
-  D, /* 077C; HAH WITH DIGIT FOUR BELOW; D; HAH */
-  D, /* 077D; SEEN WITH DIGIT FOUR ABOVE; D; SEEN */
-  D, /* 077E; SEEN WITH INVERTED V ABOVE; D; SEEN */
-  D, /* 077F; KAF WITH 2 DOTS ABOVE; D; KAF */
+  /* 0750 */                                 D,D,D,D,D,D,D,D,D,R,R,R,D,D,D,D,
+  /* 0760 */ D,D,D,D,D,D,D,D,D,D,D,R,R,D,D,D,D,R,D,R,R,D,D,D,R,R,D,D,D,D,D,D,
 
   /* Thaana */
 
-  X, /* 0780 */
-  X, /* 0781 */
-  X, /* 0782 */
-  X, /* 0783 */
-  X, /* 0784 */
-  X, /* 0785 */
-  X, /* 0786 */
-  X, /* 0787 */
-  X, /* 0788 */
-  X, /* 0789 */
-  X, /* 078A */
-  X, /* 078B */
-  X, /* 078C */
-  X, /* 078D */
-  X, /* 078E */
-  X, /* 078F */
-  X, /* 0790 */
-  X, /* 0791 */
-  X, /* 0792 */
-  X, /* 0793 */
-  X, /* 0794 */
-  X, /* 0795 */
-  X, /* 0796 */
-  X, /* 0797 */
-  X, /* 0798 */
-  X, /* 0799 */
-  X, /* 079A */
-  X, /* 079B */
-  X, /* 079C */
-  X, /* 079D */
-  X, /* 079E */
-  X, /* 079F */
-  X, /* 07A0 */
-  X, /* 07A1 */
-  X, /* 07A2 */
-  X, /* 07A3 */
-  X, /* 07A4 */
-  X, /* 07A5 */
-  X, /* 07A6 */
-  X, /* 07A7 */
-  X, /* 07A8 */
-  X, /* 07A9 */
-  X, /* 07AA */
-  X, /* 07AB */
-  X, /* 07AC */
-  X, /* 07AD */
-  X, /* 07AE */
-  X, /* 07AF */
-  X, /* 07B0 */
-  X, /* 07B1 */
-  X, /* 07B2 */
-  X, /* 07B3 */
-  X, /* 07B4 */
-  X, /* 07B5 */
-  X, /* 07B6 */
-  X, /* 07B7 */
-  X, /* 07B8 */
-  X, /* 07B9 */
-  X, /* 07BA */
-  X, /* 07BB */
-  X, /* 07BC */
-  X, /* 07BD */
-  X, /* 07BE */
-  X, /* 07BF */
+  /* 0780 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 07A0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
 
   /* NKo */
 
-  X, /* 07C0 */
-  X, /* 07C1 */
-  X, /* 07C2 */
-  X, /* 07C3 */
-  X, /* 07C4 */
-  X, /* 07C5 */
-  X, /* 07C6 */
-  X, /* 07C7 */
-  X, /* 07C8 */
-  X, /* 07C9 */
-  D, /* 07CA; NKO A; D; No_Joining_Group */
-  D, /* 07CB; NKO EE; D; No_Joining_Group */
-  D, /* 07CC; NKO I; D; No_Joining_Group */
-  D, /* 07CD; NKO E; D; No_Joining_Group */
-  D, /* 07CE; NKO U; D; No_Joining_Group */
-  D, /* 07CF; NKO OO; D; No_Joining_Group */
-  D, /* 07D0; NKO O; D; No_Joining_Group */
-  D, /* 07D1; NKO DAGBASINNA; D; No_Joining_Group */
-  D, /* 07D2; NKO N; D; No_Joining_Group */
-  D, /* 07D3; NKO BA; D; No_Joining_Group */
-  D, /* 07D4; NKO PA; D; No_Joining_Group */
-  D, /* 07D5; NKO TA; D; No_Joining_Group */
-  D, /* 07D6; NKO JA; D; No_Joining_Group */
-  D, /* 07D7; NKO CHA; D; No_Joining_Group */
-  D, /* 07D8; NKO DA; D; No_Joining_Group */
-  D, /* 07D9; NKO RA; D; No_Joining_Group */
-  D, /* 07DA; NKO RRA; D; No_Joining_Group */
-  D, /* 07DB; NKO SA; D; No_Joining_Group */
-  D, /* 07DC; NKO GBA; D; No_Joining_Group */
-  D, /* 07DD; NKO FA; D; No_Joining_Group */
-  D, /* 07DE; NKO KA; D; No_Joining_Group */
-  D, /* 07DF; NKO LA; D; No_Joining_Group */
-  D, /* 07E0; NKO NA WOLOSO; D; No_Joining_Group */
-  D, /* 07E1; NKO MA; D; No_Joining_Group */
-  D, /* 07E2; NKO NYA; D; No_Joining_Group */
-  D, /* 07E3; NKO NA; D; No_Joining_Group */
-  D, /* 07E4; NKO HA; D; No_Joining_Group */
-  D, /* 07E5; NKO WA; D; No_Joining_Group */
-  D, /* 07E6; NKO YA; D; No_Joining_Group */
-  D, /* 07E7; NKO NYA WOLOSO; D; No_Joining_Group */
-  D, /* 07E8; NKO JONA JA; D; No_Joining_Group */
-  D, /* 07E9; NKO JONA CHA; D; No_Joining_Group */
-  D, /* 07EA; NKO JONA RA; D; No_Joining_Group */
-  X, /* 07EB */
-  X, /* 07EC */
-  X, /* 07ED */
-  X, /* 07EE */
-  X, /* 07EF */
-  X, /* 07F0 */
-  X, /* 07F1 */
-  X, /* 07F2 */
-  X, /* 07F3 */
-  X, /* 07F4 */
-  X, /* 07F5 */
-  X, /* 07F6 */
-  X, /* 07F7 */
-  X, /* 07F8 */
-  X, /* 07F9 */
-  C, /* 07FA; NKO LAJANYALAN; C; No_Joining_Group */
-  X, /* 07FB */
-  X, /* 07FC */
-  X, /* 07FD */
-  X, /* 07FE */
-  X, /* 07FF */
+  /* 07C0 */ X,X,X,X,X,X,X,X,X,X,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+  /* 07E0 */ D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,C,X,X,X,X,X,
 
   /* Samaritan */
 
-  X, /* 0800 */
-  X, /* 0801 */
-  X, /* 0802 */
-  X, /* 0803 */
-  X, /* 0804 */
-  X, /* 0805 */
-  X, /* 0806 */
-  X, /* 0807 */
-  X, /* 0808 */
-  X, /* 0809 */
-  X, /* 080A */
-  X, /* 080B */
-  X, /* 080C */
-  X, /* 080D */
-  X, /* 080E */
-  X, /* 080F */
-  X, /* 0810 */
-  X, /* 0811 */
-  X, /* 0812 */
-  X, /* 0813 */
-  X, /* 0814 */
-  X, /* 0815 */
-  X, /* 0816 */
-  X, /* 0817 */
-  X, /* 0818 */
-  X, /* 0819 */
-  X, /* 081A */
-  X, /* 081B */
-  X, /* 081C */
-  X, /* 081D */
-  X, /* 081E */
-  X, /* 081F */
-  X, /* 0820 */
-  X, /* 0821 */
-  X, /* 0822 */
-  X, /* 0823 */
-  X, /* 0824 */
-  X, /* 0825 */
-  X, /* 0826 */
-  X, /* 0827 */
-  X, /* 0828 */
-  X, /* 0829 */
-  X, /* 082A */
-  X, /* 082B */
-  X, /* 082C */
-  X, /* 082D */
-  X, /* 082E */
-  X, /* 082F */
-  X, /* 0830 */
-  X, /* 0831 */
-  X, /* 0832 */
-  X, /* 0833 */
-  X, /* 0834 */
-  X, /* 0835 */
-  X, /* 0836 */
-  X, /* 0837 */
-  X, /* 0838 */
-  X, /* 0839 */
-  X, /* 083A */
-  X, /* 083B */
-  X, /* 083C */
-  X, /* 083D */
-  X, /* 083E */
-  X, /* 083F */
+  /* 0800 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0820 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
 
   /* Mandaic */
 
-  R, /* 0840; MANDAIC HALQA; R; No_Joining_Group */
-  D, /* 0841; MANDAIC AB; D; No_Joining_Group */
-  D, /* 0842; MANDAIC AG; D; No_Joining_Group */
-  D, /* 0843; MANDAIC AD; D; No_Joining_Group */
-  D, /* 0844; MANDAIC AH; D; No_Joining_Group */
-  D, /* 0845; MANDAIC USHENNA; D; No_Joining_Group */
-  R, /* 0846; MANDAIC AZ; R; No_Joining_Group */
-  D, /* 0847; MANDAIC IT; D; No_Joining_Group */
-  D, /* 0848; MANDAIC ATT; D; No_Joining_Group */
-  R, /* 0849; MANDAIC AKSA; R; No_Joining_Group */
-  D, /* 084A; MANDAIC AK; D; No_Joining_Group */
-  D, /* 084B; MANDAIC AL; D; No_Joining_Group */
-  D, /* 084C; MANDAIC AM; D; No_Joining_Group */
-  D, /* 084D; MANDAIC AN; D; No_Joining_Group */
-  D, /* 084E; MANDAIC AS; D; No_Joining_Group */
-  R, /* 084F; MANDAIC IN; R; No_Joining_Group */
-  D, /* 0850; MANDAIC AP; D; No_Joining_Group */
-  D, /* 0851; MANDAIC ASZ; D; No_Joining_Group */
-  D, /* 0852; MANDAIC AQ; D; No_Joining_Group */
-  D, /* 0853; MANDAIC AR; D; No_Joining_Group */
-  R, /* 0854; MANDAIC ASH; R; No_Joining_Group */
-  D, /* 0855; MANDAIC AT; D; No_Joining_Group */
-  U, /* 0856; MANDAIC DUSHENNA; U; No_Joining_Group */
-  U, /* 0857; MANDAIC KAD; U; No_Joining_Group */
-  U, /* 0858; MANDAIC AIN; U; No_Joining_Group */
-  X, /* 0859 */
-  X, /* 085A */
-  X, /* 085B */
-  X, /* 085C */
-  X, /* 085D */
-  X, /* 085E */
-  X, /* 085F */
-  X, /* 0860 */
-  X, /* 0861 */
-  X, /* 0862 */
-  X, /* 0863 */
-  X, /* 0864 */
-  X, /* 0865 */
-  X, /* 0866 */
-  X, /* 0867 */
-  X, /* 0868 */
-  X, /* 0869 */
-  X, /* 086A */
-  X, /* 086B */
-  X, /* 086C */
-  X, /* 086D */
-  X, /* 086E */
-  X, /* 086F */
-  X, /* 0870 */
-  X, /* 0871 */
-  X, /* 0872 */
-  X, /* 0873 */
-  X, /* 0874 */
-  X, /* 0875 */
-  X, /* 0876 */
-  X, /* 0877 */
-  X, /* 0878 */
-  X, /* 0879 */
-  X, /* 087A */
-  X, /* 087B */
-  X, /* 087C */
-  X, /* 087D */
-  X, /* 087E */
-  X, /* 087F */
-  X, /* 0880 */
-  X, /* 0881 */
-  X, /* 0882 */
-  X, /* 0883 */
-  X, /* 0884 */
-  X, /* 0885 */
-  X, /* 0886 */
-  X, /* 0887 */
-  X, /* 0888 */
-  X, /* 0889 */
-  X, /* 088A */
-  X, /* 088B */
-  X, /* 088C */
-  X, /* 088D */
-  X, /* 088E */
-  X, /* 088F */
-  X, /* 0890 */
-  X, /* 0891 */
-  X, /* 0892 */
-  X, /* 0893 */
-  X, /* 0894 */
-  X, /* 0895 */
-  X, /* 0896 */
-  X, /* 0897 */
-  X, /* 0898 */
-  X, /* 0899 */
-  X, /* 089A */
-  X, /* 089B */
-  X, /* 089C */
-  X, /* 089D */
-  X, /* 089E */
-  X, /* 089F */
+  /* 0840 */ R,D,D,D,D,D,R,D,D,R,D,D,D,D,D,R,D,D,D,D,R,D,U,U,U,X,X,X,X,X,X,X,
+  /* 0860 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0880 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
 
   /* Arabic Extended-A */
 
-  D, /* 08A0; DOTLESS BEH WITH V BELOW; D; BEH */
-  X, /* 08A1 */
-  D, /* 08A2; HAH WITH DOT BELOW AND 2 DOTS ABOVE; D; HAH */
-  D, /* 08A3; TAH WITH 2 DOTS ABOVE; D; TAH */
-  D, /* 08A4; DOTLESS FEH WITH DOT BELOW AND 3 DOTS ABOVE; D; FEH */
-  D, /* 08A5; QAF WITH DOT BELOW; D; QAF */
-  D, /* 08A6; LAM WITH DOUBLE BAR; D; LAM */
-  D, /* 08A7; MEEM WITH 3 DOTS ABOVE; D; MEEM */
-  D, /* 08A8; YEH WITH HAMZA ABOVE; D; YEH */
-  D, /* 08A9; YEH WITH DOT ABOVE; D; YEH */
-  R, /* 08AA; REH WITH LOOP; R; REH */
-  R, /* 08AB; WAW WITH DOT WITHIN; R; WAW */
-  R, /* 08AC; ROHINGYA YEH; R; ROHINGYA YEH */
-
+  /* 08A0 */ D,X,D,D,D,D,D,D,D,D,R,R,R,
 };
 
 #define JOINING_TABLE_FIRST	0x0600
commit 200dfe3eb10feda2ad25940338b08011f4757ca4
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Jun 20 16:20:59 2014 -0400

    [arabic-table] Use short names for values
    
    No functional change.

diff --git a/src/gen-arabic-table.py b/src/gen-arabic-table.py
index 534f560..28f10f7 100755
--- a/src/gen-arabic-table.py
+++ b/src/gen-arabic-table.py
@@ -61,6 +61,16 @@ def print_joining_table(f):
 			value = "JOINING_TYPE_" + fields[2]
 		values[u] = (value, fields)
 
+	short_value = {}
+	for value in set([v[0] for v in values.values()] + ['JOINING_TYPE_X']):
+		short = ''.join(x[0] for x in value.split('_')[2:])
+		assert short not in short_value.values()
+		short_value[value] = short
+
+	print
+	for value,short in short_value.items():
+		print "#define %s	%s" % (short, value)
+
 	keys = values.keys()
 	min_u = min(keys)
 	max_u = max(keys)
@@ -76,7 +86,7 @@ def print_joining_table(f):
 			print "\n  /* %s */\n" % block
 			last_block = block
 
-		print "  %s, /* %s */" % (value, '; '.join(fields))
+		print "  %s, /* %s */" % (short_value[value], '; '.join(fields))
 	print
 	print "};"
 	print
@@ -89,6 +99,10 @@ def print_joining_table(f):
 	if occupancy < 40:
 		raise Exception ("Table too sparse, please investigate: ", occupancy)
 
+	for value,short in short_value.items():
+		print "#undef %s" % (short)
+	print
+
 def print_shaping_table(f):
 
 	shapes = {}
diff --git a/src/hb-ot-shape-complex-arabic-table.hh b/src/hb-ot-shape-complex-arabic-table.hh
index 3375266..579de89 100644
--- a/src/hb-ot-shape-complex-arabic-table.hh
+++ b/src/hb-ot-shape-complex-arabic-table.hh
@@ -17,723 +17,739 @@
 #define HB_OT_SHAPE_COMPLEX_ARABIC_TABLE_HH
 
 
+#define X	JOINING_TYPE_X
+#define R	JOINING_TYPE_R
+#define U	JOINING_TYPE_U
+#define A	JOINING_GROUP_ALAPH
+#define DR	JOINING_GROUP_DALATH_RISH
+#define C	JOINING_TYPE_C
+#define D	JOINING_TYPE_D
+
 static const uint8_t joining_table[] =
 {
 
   /* Arabic */
 
-  JOINING_TYPE_U, /* 0600; ARABIC NUMBER SIGN; U; No_Joining_Group */
-  JOINING_TYPE_U, /* 0601; ARABIC SIGN SANAH; U; No_Joining_Group */
-  JOINING_TYPE_U, /* 0602; ARABIC FOOTNOTE MARKER; U; No_Joining_Group */
-  JOINING_TYPE_U, /* 0603; ARABIC SIGN SAFHA; U; No_Joining_Group */
-  JOINING_TYPE_U, /* 0604; ARABIC SIGN SAMVAT; U; No_Joining_Group */
-  JOINING_TYPE_X, /* 0605 */
-  JOINING_TYPE_X, /* 0606 */
-  JOINING_TYPE_X, /* 0607 */
-  JOINING_TYPE_U, /* 0608; ARABIC RAY; U; No_Joining_Group */
-  JOINING_TYPE_X, /* 0609 */
-  JOINING_TYPE_X, /* 060A */
-  JOINING_TYPE_U, /* 060B; AFGHANI SIGN; U; No_Joining_Group */
-  JOINING_TYPE_X, /* 060C */
-  JOINING_TYPE_X, /* 060D */
-  JOINING_TYPE_X, /* 060E */
-  JOINING_TYPE_X, /* 060F */
-  JOINING_TYPE_X, /* 0610 */
-  JOINING_TYPE_X, /* 0611 */
-  JOINING_TYPE_X, /* 0612 */
-  JOINING_TYPE_X, /* 0613 */
-  JOINING_TYPE_X, /* 0614 */
-  JOINING_TYPE_X, /* 0615 */
-  JOINING_TYPE_X, /* 0616 */
-  JOINING_TYPE_X, /* 0617 */
-  JOINING_TYPE_X, /* 0618 */
-  JOINING_TYPE_X, /* 0619 */
-  JOINING_TYPE_X, /* 061A */
-  JOINING_TYPE_X, /* 061B */
-  JOINING_TYPE_X, /* 061C */
-  JOINING_TYPE_X, /* 061D */
-  JOINING_TYPE_X, /* 061E */
-  JOINING_TYPE_X, /* 061F */
-  JOINING_TYPE_D, /* 0620; DOTLESS YEH WITH SEPARATE RING BELOW; D; YEH */
-  JOINING_TYPE_U, /* 0621; HAMZA; U; No_Joining_Group */
-  JOINING_TYPE_R, /* 0622; ALEF WITH MADDA ABOVE; R; ALEF */
-  JOINING_TYPE_R, /* 0623; ALEF WITH HAMZA ABOVE; R; ALEF */
-  JOINING_TYPE_R, /* 0624; WAW WITH HAMZA ABOVE; R; WAW */
-  JOINING_TYPE_R, /* 0625; ALEF WITH HAMZA BELOW; R; ALEF */
-  JOINING_TYPE_D, /* 0626; DOTLESS YEH WITH HAMZA ABOVE; D; YEH */
-  JOINING_TYPE_R, /* 0627; ALEF; R; ALEF */
-  JOINING_TYPE_D, /* 0628; BEH; D; BEH */
-  JOINING_TYPE_R, /* 0629; TEH MARBUTA; R; TEH MARBUTA */
-  JOINING_TYPE_D, /* 062A; DOTLESS BEH WITH 2 DOTS ABOVE; D; BEH */
-  JOINING_TYPE_D, /* 062B; DOTLESS BEH WITH 3 DOTS ABOVE; D; BEH */
-  JOINING_TYPE_D, /* 062C; HAH WITH DOT BELOW; D; HAH */
-  JOINING_TYPE_D, /* 062D; HAH; D; HAH */
-  JOINING_TYPE_D, /* 062E; HAH WITH DOT ABOVE; D; HAH */
-  JOINING_TYPE_R, /* 062F; DAL; R; DAL */
-  JOINING_TYPE_R, /* 0630; DAL WITH DOT ABOVE; R; DAL */
-  JOINING_TYPE_R, /* 0631; REH; R; REH */
-  JOINING_TYPE_R, /* 0632; REH WITH DOT ABOVE; R; REH */
-  JOINING_TYPE_D, /* 0633; SEEN; D; SEEN */
-  JOINING_TYPE_D, /* 0634; SEEN WITH 3 DOTS ABOVE; D; SEEN */
-  JOINING_TYPE_D, /* 0635; SAD; D; SAD */
-  JOINING_TYPE_D, /* 0636; SAD WITH DOT ABOVE; D; SAD */
-  JOINING_TYPE_D, /* 0637; TAH; D; TAH */
-  JOINING_TYPE_D, /* 0638; TAH WITH DOT ABOVE; D; TAH */
-  JOINING_TYPE_D, /* 0639; AIN; D; AIN */
-  JOINING_TYPE_D, /* 063A; AIN WITH DOT ABOVE; D; AIN */
-  JOINING_TYPE_D, /* 063B; KEHEH WITH 2 DOTS ABOVE; D; GAF */
-  JOINING_TYPE_D, /* 063C; KEHEH WITH 3 DOTS BELOW; D; GAF */
-  JOINING_TYPE_D, /* 063D; FARSI YEH WITH INVERTED V ABOVE; D; FARSI YEH */
-  JOINING_TYPE_D, /* 063E; FARSI YEH WITH 2 DOTS ABOVE; D; FARSI YEH */
-  JOINING_TYPE_D, /* 063F; FARSI YEH WITH 3 DOTS ABOVE; D; FARSI YEH */
-  JOINING_TYPE_C, /* 0640; TATWEEL; C; No_Joining_Group */
-  JOINING_TYPE_D, /* 0641; FEH; D; FEH */
-  JOINING_TYPE_D, /* 0642; QAF; D; QAF */
-  JOINING_TYPE_D, /* 0643; KAF; D; KAF */
-  JOINING_TYPE_D, /* 0644; LAM; D; LAM */
-  JOINING_TYPE_D, /* 0645; MEEM; D; MEEM */
-  JOINING_TYPE_D, /* 0646; NOON; D; NOON */
-  JOINING_TYPE_D, /* 0647; HEH; D; HEH */
-  JOINING_TYPE_R, /* 0648; WAW; R; WAW */
-  JOINING_TYPE_D, /* 0649; DOTLESS YEH; D; YEH */
-  JOINING_TYPE_D, /* 064A; YEH; D; YEH */
-  JOINING_TYPE_X, /* 064B */
-  JOINING_TYPE_X, /* 064C */
-  JOINING_TYPE_X, /* 064D */
-  JOINING_TYPE_X, /* 064E */
-  JOINING_TYPE_X, /* 064F */
-  JOINING_TYPE_X, /* 0650 */
-  JOINING_TYPE_X, /* 0651 */
-  JOINING_TYPE_X, /* 0652 */
-  JOINING_TYPE_X, /* 0653 */
-  JOINING_TYPE_X, /* 0654 */
-  JOINING_TYPE_X, /* 0655 */
-  JOINING_TYPE_X, /* 0656 */
-  JOINING_TYPE_X, /* 0657 */
-  JOINING_TYPE_X, /* 0658 */
-  JOINING_TYPE_X, /* 0659 */
-  JOINING_TYPE_X, /* 065A */
-  JOINING_TYPE_X, /* 065B */
-  JOINING_TYPE_X, /* 065C */
-  JOINING_TYPE_X, /* 065D */
-  JOINING_TYPE_X, /* 065E */
-  JOINING_TYPE_X, /* 065F */
-  JOINING_TYPE_X, /* 0660 */
-  JOINING_TYPE_X, /* 0661 */
-  JOINING_TYPE_X, /* 0662 */
-  JOINING_TYPE_X, /* 0663 */
-  JOINING_TYPE_X, /* 0664 */
-  JOINING_TYPE_X, /* 0665 */
-  JOINING_TYPE_X, /* 0666 */
-  JOINING_TYPE_X, /* 0667 */
-  JOINING_TYPE_X, /* 0668 */
-  JOINING_TYPE_X, /* 0669 */
-  JOINING_TYPE_X, /* 066A */
-  JOINING_TYPE_X, /* 066B */
-  JOINING_TYPE_X, /* 066C */
-  JOINING_TYPE_X, /* 066D */
-  JOINING_TYPE_D, /* 066E; DOTLESS BEH; D; BEH */
-  JOINING_TYPE_D, /* 066F; DOTLESS QAF; D; QAF */
-  JOINING_TYPE_X, /* 0670 */
-  JOINING_TYPE_R, /* 0671; ALEF WITH WASLA ABOVE; R; ALEF */
-  JOINING_TYPE_R, /* 0672; ALEF WITH WAVY HAMZA ABOVE; R; ALEF */
-  JOINING_TYPE_R, /* 0673; ALEF WITH WAVY HAMZA BELOW; R; ALEF */
-  JOINING_TYPE_U, /* 0674; HIGH HAMZA; U; No_Joining_Group */
-  JOINING_TYPE_R, /* 0675; HIGH HAMZA ALEF; R; ALEF */
-  JOINING_TYPE_R, /* 0676; HIGH HAMZA WAW; R; WAW */
-  JOINING_TYPE_R, /* 0677; HIGH HAMZA WAW WITH DAMMA ABOVE; R; WAW */
-  JOINING_TYPE_D, /* 0678; HIGH HAMZA DOTLESS YEH; D; YEH */
-  JOINING_TYPE_D, /* 0679; DOTLESS BEH WITH TAH ABOVE; D; BEH */
-  JOINING_TYPE_D, /* 067A; DOTLESS BEH WITH VERTICAL 2 DOTS ABOVE; D; BEH */
-  JOINING_TYPE_D, /* 067B; DOTLESS BEH WITH VERTICAL 2 DOTS BELOW; D; BEH */
-  JOINING_TYPE_D, /* 067C; DOTLESS BEH WITH ATTACHED RING BELOW AND 2 DOTS ABOVE; D; BEH */
-  JOINING_TYPE_D, /* 067D; DOTLESS BEH WITH INVERTED 3 DOTS ABOVE; D; BEH */
-  JOINING_TYPE_D, /* 067E; DOTLESS BEH WITH 3 DOTS BELOW; D; BEH */
-  JOINING_TYPE_D, /* 067F; DOTLESS BEH WITH 4 DOTS ABOVE; D; BEH */
-  JOINING_TYPE_D, /* 0680; DOTLESS BEH WITH 4 DOTS BELOW; D; BEH */
-  JOINING_TYPE_D, /* 0681; HAH WITH HAMZA ABOVE; D; HAH */
-  JOINING_TYPE_D, /* 0682; HAH WITH VERTICAL 2 DOTS ABOVE; D; HAH */
-  JOINING_TYPE_D, /* 0683; HAH WITH 2 DOTS BELOW; D; HAH */
-  JOINING_TYPE_D, /* 0684; HAH WITH VERTICAL 2 DOTS BELOW; D; HAH */
-  JOINING_TYPE_D, /* 0685; HAH WITH 3 DOTS ABOVE; D; HAH */
-  JOINING_TYPE_D, /* 0686; HAH WITH 3 DOTS BELOW; D; HAH */
-  JOINING_TYPE_D, /* 0687; HAH WITH 4 DOTS BELOW; D; HAH */
-  JOINING_TYPE_R, /* 0688; DAL WITH TAH ABOVE; R; DAL */
-  JOINING_TYPE_R, /* 0689; DAL WITH ATTACHED RING BELOW; R; DAL */
-  JOINING_TYPE_R, /* 068A; DAL WITH DOT BELOW; R; DAL */
-  JOINING_TYPE_R, /* 068B; DAL WITH DOT BELOW AND TAH ABOVE; R; DAL */
-  JOINING_TYPE_R, /* 068C; DAL WITH 2 DOTS ABOVE; R; DAL */
-  JOINING_TYPE_R, /* 068D; DAL WITH 2 DOTS BELOW; R; DAL */
-  JOINING_TYPE_R, /* 068E; DAL WITH 3 DOTS ABOVE; R; DAL */
-  JOINING_TYPE_R, /* 068F; DAL WITH INVERTED 3 DOTS ABOVE; R; DAL */
-  JOINING_TYPE_R, /* 0690; DAL WITH 4 DOTS ABOVE; R; DAL */
-  JOINING_TYPE_R, /* 0691; REH WITH TAH ABOVE; R; REH */
-  JOINING_TYPE_R, /* 0692; REH WITH V ABOVE; R; REH */
-  JOINING_TYPE_R, /* 0693; REH WITH ATTACHED RING BELOW; R; REH */
-  JOINING_TYPE_R, /* 0694; REH WITH DOT BELOW; R; REH */
-  JOINING_TYPE_R, /* 0695; REH WITH V BELOW; R; REH */
-  JOINING_TYPE_R, /* 0696; REH WITH DOT BELOW AND DOT WITHIN; R; REH */
-  JOINING_TYPE_R, /* 0697; REH WITH 2 DOTS ABOVE; R; REH */
-  JOINING_TYPE_R, /* 0698; REH WITH 3 DOTS ABOVE; R; REH */
-  JOINING_TYPE_R, /* 0699; REH WITH 4 DOTS ABOVE; R; REH */
-  JOINING_TYPE_D, /* 069A; SEEN WITH DOT BELOW AND DOT ABOVE; D; SEEN */
-  JOINING_TYPE_D, /* 069B; SEEN WITH 3 DOTS BELOW; D; SEEN */
-  JOINING_TYPE_D, /* 069C; SEEN WITH 3 DOTS BELOW AND 3 DOTS ABOVE; D; SEEN */
-  JOINING_TYPE_D, /* 069D; SAD WITH 2 DOTS BELOW; D; SAD */
-  JOINING_TYPE_D, /* 069E; SAD WITH 3 DOTS ABOVE; D; SAD */
-  JOINING_TYPE_D, /* 069F; TAH WITH 3 DOTS ABOVE; D; TAH */
-  JOINING_TYPE_D, /* 06A0; AIN WITH 3 DOTS ABOVE; D; AIN */
-  JOINING_TYPE_D, /* 06A1; DOTLESS FEH; D; FEH */
-  JOINING_TYPE_D, /* 06A2; DOTLESS FEH WITH DOT BELOW; D; FEH */
-  JOINING_TYPE_D, /* 06A3; FEH WITH DOT BELOW; D; FEH */
-  JOINING_TYPE_D, /* 06A4; DOTLESS FEH WITH 3 DOTS ABOVE; D; FEH */
-  JOINING_TYPE_D, /* 06A5; DOTLESS FEH WITH 3 DOTS BELOW; D; FEH */
-  JOINING_TYPE_D, /* 06A6; DOTLESS FEH WITH 4 DOTS ABOVE; D; FEH */
-  JOINING_TYPE_D, /* 06A7; DOTLESS QAF WITH DOT ABOVE; D; QAF */
-  JOINING_TYPE_D, /* 06A8; DOTLESS QAF WITH 3 DOTS ABOVE; D; QAF */
-  JOINING_TYPE_D, /* 06A9; KEHEH; D; GAF */
-  JOINING_TYPE_D, /* 06AA; SWASH KAF; D; SWASH KAF */
-  JOINING_TYPE_D, /* 06AB; KEHEH WITH ATTACHED RING BELOW; D; GAF */
-  JOINING_TYPE_D, /* 06AC; KAF WITH DOT ABOVE; D; KAF */
-  JOINING_TYPE_D, /* 06AD; KAF WITH 3 DOTS ABOVE; D; KAF */
-  JOINING_TYPE_D, /* 06AE; KAF WITH 3 DOTS BELOW; D; KAF */
-  JOINING_TYPE_D, /* 06AF; GAF; D; GAF */
-  JOINING_TYPE_D, /* 06B0; GAF WITH ATTACHED RING BELOW; D; GAF */
-  JOINING_TYPE_D, /* 06B1; GAF WITH 2 DOTS ABOVE; D; GAF */
-  JOINING_TYPE_D, /* 06B2; GAF WITH 2 DOTS BELOW; D; GAF */
-  JOINING_TYPE_D, /* 06B3; GAF WITH VERTICAL 2 DOTS BELOW; D; GAF */
-  JOINING_TYPE_D, /* 06B4; GAF WITH 3 DOTS ABOVE; D; GAF */
-  JOINING_TYPE_D, /* 06B5; LAM WITH V ABOVE; D; LAM */
-  JOINING_TYPE_D, /* 06B6; LAM WITH DOT ABOVE; D; LAM */
-  JOINING_TYPE_D, /* 06B7; LAM WITH 3 DOTS ABOVE; D; LAM */
-  JOINING_TYPE_D, /* 06B8; LAM WITH 3 DOTS BELOW; D; LAM */
-  JOINING_TYPE_D, /* 06B9; NOON WITH DOT BELOW; D; NOON */
-  JOINING_TYPE_D, /* 06BA; DOTLESS NOON; D; NOON */
-  JOINING_TYPE_D, /* 06BB; DOTLESS NOON WITH TAH ABOVE; D; NOON */
-  JOINING_TYPE_D, /* 06BC; NOON WITH ATTACHED RING BELOW; D; NOON */
-  JOINING_TYPE_D, /* 06BD; NYA; D; NYA */
-  JOINING_TYPE_D, /* 06BE; KNOTTED HEH; D; KNOTTED HEH */
-  JOINING_TYPE_D, /* 06BF; HAH WITH 3 DOTS BELOW AND DOT ABOVE; D; HAH */
-  JOINING_TYPE_R, /* 06C0; DOTLESS TEH MARBUTA WITH HAMZA ABOVE; R; TEH MARBUTA */
-  JOINING_TYPE_D, /* 06C1; HEH GOAL; D; HEH GOAL */
-  JOINING_TYPE_D, /* 06C2; HEH GOAL WITH HAMZA ABOVE; D; HEH GOAL */
-  JOINING_TYPE_R, /* 06C3; TEH MARBUTA GOAL; R; TEH MARBUTA GOAL */
-  JOINING_TYPE_R, /* 06C4; WAW WITH ATTACHED RING WITHIN; R; WAW */
-  JOINING_TYPE_R, /* 06C5; WAW WITH BAR; R; WAW */
-  JOINING_TYPE_R, /* 06C6; WAW WITH V ABOVE; R; WAW */
-  JOINING_TYPE_R, /* 06C7; WAW WITH DAMMA ABOVE; R; WAW */
-  JOINING_TYPE_R, /* 06C8; WAW WITH ALEF ABOVE; R; WAW */
-  JOINING_TYPE_R, /* 06C9; WAW WITH INVERTED V ABOVE; R; WAW */
-  JOINING_TYPE_R, /* 06CA; WAW WITH 2 DOTS ABOVE; R; WAW */
-  JOINING_TYPE_R, /* 06CB; WAW WITH 3 DOTS ABOVE; R; WAW */
-  JOINING_TYPE_D, /* 06CC; FARSI YEH; D; FARSI YEH */
-  JOINING_TYPE_R, /* 06CD; YEH WITH TAIL; R; YEH WITH TAIL */
-  JOINING_TYPE_D, /* 06CE; FARSI YEH WITH V ABOVE; D; FARSI YEH */
-  JOINING_TYPE_R, /* 06CF; WAW WITH DOT ABOVE; R; WAW */
-  JOINING_TYPE_D, /* 06D0; DOTLESS YEH WITH VERTICAL 2 DOTS BELOW; D; YEH */
-  JOINING_TYPE_D, /* 06D1; DOTLESS YEH WITH 3 DOTS BELOW; D; YEH */
-  JOINING_TYPE_R, /* 06D2; YEH BARREE; R; YEH BARREE */
-  JOINING_TYPE_R, /* 06D3; YEH BARREE WITH HAMZA ABOVE; R; YEH BARREE */
-  JOINING_TYPE_X, /* 06D4 */
-  JOINING_TYPE_R, /* 06D5; DOTLESS TEH MARBUTA; R; TEH MARBUTA */
-  JOINING_TYPE_X, /* 06D6 */
-  JOINING_TYPE_X, /* 06D7 */
-  JOINING_TYPE_X, /* 06D8 */
-  JOINING_TYPE_X, /* 06D9 */
-  JOINING_TYPE_X, /* 06DA */
-  JOINING_TYPE_X, /* 06DB */
-  JOINING_TYPE_X, /* 06DC */
-  JOINING_TYPE_U, /* 06DD; ARABIC END OF AYAH; U; No_Joining_Group */
-  JOINING_TYPE_X, /* 06DE */
-  JOINING_TYPE_X, /* 06DF */
-  JOINING_TYPE_X, /* 06E0 */
-  JOINING_TYPE_X, /* 06E1 */
-  JOINING_TYPE_X, /* 06E2 */
-  JOINING_TYPE_X, /* 06E3 */
-  JOINING_TYPE_X, /* 06E4 */
-  JOINING_TYPE_X, /* 06E5 */
-  JOINING_TYPE_X, /* 06E6 */
-  JOINING_TYPE_X, /* 06E7 */
-  JOINING_TYPE_X, /* 06E8 */
-  JOINING_TYPE_X, /* 06E9 */
-  JOINING_TYPE_X, /* 06EA */
-  JOINING_TYPE_X, /* 06EB */
-  JOINING_TYPE_X, /* 06EC */
-  JOINING_TYPE_X, /* 06ED */
-  JOINING_TYPE_R, /* 06EE; DAL WITH INVERTED V ABOVE; R; DAL */
-  JOINING_TYPE_R, /* 06EF; REH WITH INVERTED V ABOVE; R; REH */
-  JOINING_TYPE_X, /* 06F0 */
-  JOINING_TYPE_X, /* 06F1 */
-  JOINING_TYPE_X, /* 06F2 */
-  JOINING_TYPE_X, /* 06F3 */
-  JOINING_TYPE_X, /* 06F4 */
-  JOINING_TYPE_X, /* 06F5 */
-  JOINING_TYPE_X, /* 06F6 */
-  JOINING_TYPE_X, /* 06F7 */
-  JOINING_TYPE_X, /* 06F8 */
-  JOINING_TYPE_X, /* 06F9 */
-  JOINING_TYPE_D, /* 06FA; SEEN WITH DOT BELOW AND 3 DOTS ABOVE; D; SEEN */
-  JOINING_TYPE_D, /* 06FB; SAD WITH DOT BELOW AND DOT ABOVE; D; SAD */
-  JOINING_TYPE_D, /* 06FC; AIN WITH DOT BELOW AND DOT ABOVE; D; AIN */
-  JOINING_TYPE_X, /* 06FD */
-  JOINING_TYPE_X, /* 06FE */
-  JOINING_TYPE_D, /* 06FF; KNOTTED HEH WITH INVERTED V ABOVE; D; KNOTTED HEH */
+  U, /* 0600; ARABIC NUMBER SIGN; U; No_Joining_Group */
+  U, /* 0601; ARABIC SIGN SANAH; U; No_Joining_Group */
+  U, /* 0602; ARABIC FOOTNOTE MARKER; U; No_Joining_Group */
+  U, /* 0603; ARABIC SIGN SAFHA; U; No_Joining_Group */
+  U, /* 0604; ARABIC SIGN SAMVAT; U; No_Joining_Group */
+  X, /* 0605 */
+  X, /* 0606 */
+  X, /* 0607 */
+  U, /* 0608; ARABIC RAY; U; No_Joining_Group */
+  X, /* 0609 */
+  X, /* 060A */
+  U, /* 060B; AFGHANI SIGN; U; No_Joining_Group */
+  X, /* 060C */
+  X, /* 060D */
+  X, /* 060E */
+  X, /* 060F */
+  X, /* 0610 */
+  X, /* 0611 */
+  X, /* 0612 */
+  X, /* 0613 */
+  X, /* 0614 */
+  X, /* 0615 */
+  X, /* 0616 */
+  X, /* 0617 */
+  X, /* 0618 */
+  X, /* 0619 */
+  X, /* 061A */
+  X, /* 061B */
+  X, /* 061C */
+  X, /* 061D */
+  X, /* 061E */
+  X, /* 061F */
+  D, /* 0620; DOTLESS YEH WITH SEPARATE RING BELOW; D; YEH */
+  U, /* 0621; HAMZA; U; No_Joining_Group */
+  R, /* 0622; ALEF WITH MADDA ABOVE; R; ALEF */
+  R, /* 0623; ALEF WITH HAMZA ABOVE; R; ALEF */
+  R, /* 0624; WAW WITH HAMZA ABOVE; R; WAW */
+  R, /* 0625; ALEF WITH HAMZA BELOW; R; ALEF */
+  D, /* 0626; DOTLESS YEH WITH HAMZA ABOVE; D; YEH */
+  R, /* 0627; ALEF; R; ALEF */
+  D, /* 0628; BEH; D; BEH */
+  R, /* 0629; TEH MARBUTA; R; TEH MARBUTA */
+  D, /* 062A; DOTLESS BEH WITH 2 DOTS ABOVE; D; BEH */
+  D, /* 062B; DOTLESS BEH WITH 3 DOTS ABOVE; D; BEH */
+  D, /* 062C; HAH WITH DOT BELOW; D; HAH */
+  D, /* 062D; HAH; D; HAH */
+  D, /* 062E; HAH WITH DOT ABOVE; D; HAH */
+  R, /* 062F; DAL; R; DAL */
+  R, /* 0630; DAL WITH DOT ABOVE; R; DAL */
+  R, /* 0631; REH; R; REH */
+  R, /* 0632; REH WITH DOT ABOVE; R; REH */
+  D, /* 0633; SEEN; D; SEEN */
+  D, /* 0634; SEEN WITH 3 DOTS ABOVE; D; SEEN */
+  D, /* 0635; SAD; D; SAD */
+  D, /* 0636; SAD WITH DOT ABOVE; D; SAD */
+  D, /* 0637; TAH; D; TAH */
+  D, /* 0638; TAH WITH DOT ABOVE; D; TAH */
+  D, /* 0639; AIN; D; AIN */
+  D, /* 063A; AIN WITH DOT ABOVE; D; AIN */
+  D, /* 063B; KEHEH WITH 2 DOTS ABOVE; D; GAF */
+  D, /* 063C; KEHEH WITH 3 DOTS BELOW; D; GAF */
+  D, /* 063D; FARSI YEH WITH INVERTED V ABOVE; D; FARSI YEH */
+  D, /* 063E; FARSI YEH WITH 2 DOTS ABOVE; D; FARSI YEH */
+  D, /* 063F; FARSI YEH WITH 3 DOTS ABOVE; D; FARSI YEH */
+  C, /* 0640; TATWEEL; C; No_Joining_Group */
+  D, /* 0641; FEH; D; FEH */
+  D, /* 0642; QAF; D; QAF */
+  D, /* 0643; KAF; D; KAF */
+  D, /* 0644; LAM; D; LAM */
+  D, /* 0645; MEEM; D; MEEM */
+  D, /* 0646; NOON; D; NOON */
+  D, /* 0647; HEH; D; HEH */
+  R, /* 0648; WAW; R; WAW */
+  D, /* 0649; DOTLESS YEH; D; YEH */
+  D, /* 064A; YEH; D; YEH */
+  X, /* 064B */
+  X, /* 064C */
+  X, /* 064D */
+  X, /* 064E */
+  X, /* 064F */
+  X, /* 0650 */
+  X, /* 0651 */
+  X, /* 0652 */
+  X, /* 0653 */
+  X, /* 0654 */
+  X, /* 0655 */
+  X, /* 0656 */
+  X, /* 0657 */
+  X, /* 0658 */
+  X, /* 0659 */
+  X, /* 065A */
+  X, /* 065B */
+  X, /* 065C */
+  X, /* 065D */
+  X, /* 065E */
+  X, /* 065F */
+  X, /* 0660 */
+  X, /* 0661 */
+  X, /* 0662 */
+  X, /* 0663 */
+  X, /* 0664 */
+  X, /* 0665 */
+  X, /* 0666 */
+  X, /* 0667 */
+  X, /* 0668 */
+  X, /* 0669 */
+  X, /* 066A */
+  X, /* 066B */
+  X, /* 066C */
+  X, /* 066D */
+  D, /* 066E; DOTLESS BEH; D; BEH */
+  D, /* 066F; DOTLESS QAF; D; QAF */
+  X, /* 0670 */
+  R, /* 0671; ALEF WITH WASLA ABOVE; R; ALEF */
+  R, /* 0672; ALEF WITH WAVY HAMZA ABOVE; R; ALEF */
+  R, /* 0673; ALEF WITH WAVY HAMZA BELOW; R; ALEF */
+  U, /* 0674; HIGH HAMZA; U; No_Joining_Group */
+  R, /* 0675; HIGH HAMZA ALEF; R; ALEF */
+  R, /* 0676; HIGH HAMZA WAW; R; WAW */
+  R, /* 0677; HIGH HAMZA WAW WITH DAMMA ABOVE; R; WAW */
+  D, /* 0678; HIGH HAMZA DOTLESS YEH; D; YEH */
+  D, /* 0679; DOTLESS BEH WITH TAH ABOVE; D; BEH */
+  D, /* 067A; DOTLESS BEH WITH VERTICAL 2 DOTS ABOVE; D; BEH */
+  D, /* 067B; DOTLESS BEH WITH VERTICAL 2 DOTS BELOW; D; BEH */
+  D, /* 067C; DOTLESS BEH WITH ATTACHED RING BELOW AND 2 DOTS ABOVE; D; BEH */
+  D, /* 067D; DOTLESS BEH WITH INVERTED 3 DOTS ABOVE; D; BEH */
+  D, /* 067E; DOTLESS BEH WITH 3 DOTS BELOW; D; BEH */
+  D, /* 067F; DOTLESS BEH WITH 4 DOTS ABOVE; D; BEH */
+  D, /* 0680; DOTLESS BEH WITH 4 DOTS BELOW; D; BEH */
+  D, /* 0681; HAH WITH HAMZA ABOVE; D; HAH */
+  D, /* 0682; HAH WITH VERTICAL 2 DOTS ABOVE; D; HAH */
+  D, /* 0683; HAH WITH 2 DOTS BELOW; D; HAH */
+  D, /* 0684; HAH WITH VERTICAL 2 DOTS BELOW; D; HAH */
+  D, /* 0685; HAH WITH 3 DOTS ABOVE; D; HAH */
+  D, /* 0686; HAH WITH 3 DOTS BELOW; D; HAH */
+  D, /* 0687; HAH WITH 4 DOTS BELOW; D; HAH */
+  R, /* 0688; DAL WITH TAH ABOVE; R; DAL */
+  R, /* 0689; DAL WITH ATTACHED RING BELOW; R; DAL */
+  R, /* 068A; DAL WITH DOT BELOW; R; DAL */
+  R, /* 068B; DAL WITH DOT BELOW AND TAH ABOVE; R; DAL */
+  R, /* 068C; DAL WITH 2 DOTS ABOVE; R; DAL */
+  R, /* 068D; DAL WITH 2 DOTS BELOW; R; DAL */
+  R, /* 068E; DAL WITH 3 DOTS ABOVE; R; DAL */
+  R, /* 068F; DAL WITH INVERTED 3 DOTS ABOVE; R; DAL */
+  R, /* 0690; DAL WITH 4 DOTS ABOVE; R; DAL */
+  R, /* 0691; REH WITH TAH ABOVE; R; REH */
+  R, /* 0692; REH WITH V ABOVE; R; REH */
+  R, /* 0693; REH WITH ATTACHED RING BELOW; R; REH */
+  R, /* 0694; REH WITH DOT BELOW; R; REH */
+  R, /* 0695; REH WITH V BELOW; R; REH */
+  R, /* 0696; REH WITH DOT BELOW AND DOT WITHIN; R; REH */
+  R, /* 0697; REH WITH 2 DOTS ABOVE; R; REH */
+  R, /* 0698; REH WITH 3 DOTS ABOVE; R; REH */
+  R, /* 0699; REH WITH 4 DOTS ABOVE; R; REH */
+  D, /* 069A; SEEN WITH DOT BELOW AND DOT ABOVE; D; SEEN */
+  D, /* 069B; SEEN WITH 3 DOTS BELOW; D; SEEN */
+  D, /* 069C; SEEN WITH 3 DOTS BELOW AND 3 DOTS ABOVE; D; SEEN */
+  D, /* 069D; SAD WITH 2 DOTS BELOW; D; SAD */
+  D, /* 069E; SAD WITH 3 DOTS ABOVE; D; SAD */
+  D, /* 069F; TAH WITH 3 DOTS ABOVE; D; TAH */
+  D, /* 06A0; AIN WITH 3 DOTS ABOVE; D; AIN */
+  D, /* 06A1; DOTLESS FEH; D; FEH */
+  D, /* 06A2; DOTLESS FEH WITH DOT BELOW; D; FEH */
+  D, /* 06A3; FEH WITH DOT BELOW; D; FEH */
+  D, /* 06A4; DOTLESS FEH WITH 3 DOTS ABOVE; D; FEH */
+  D, /* 06A5; DOTLESS FEH WITH 3 DOTS BELOW; D; FEH */
+  D, /* 06A6; DOTLESS FEH WITH 4 DOTS ABOVE; D; FEH */
+  D, /* 06A7; DOTLESS QAF WITH DOT ABOVE; D; QAF */
+  D, /* 06A8; DOTLESS QAF WITH 3 DOTS ABOVE; D; QAF */
+  D, /* 06A9; KEHEH; D; GAF */
+  D, /* 06AA; SWASH KAF; D; SWASH KAF */
+  D, /* 06AB; KEHEH WITH ATTACHED RING BELOW; D; GAF */
+  D, /* 06AC; KAF WITH DOT ABOVE; D; KAF */
+  D, /* 06AD; KAF WITH 3 DOTS ABOVE; D; KAF */
+  D, /* 06AE; KAF WITH 3 DOTS BELOW; D; KAF */
+  D, /* 06AF; GAF; D; GAF */
+  D, /* 06B0; GAF WITH ATTACHED RING BELOW; D; GAF */
+  D, /* 06B1; GAF WITH 2 DOTS ABOVE; D; GAF */
+  D, /* 06B2; GAF WITH 2 DOTS BELOW; D; GAF */
+  D, /* 06B3; GAF WITH VERTICAL 2 DOTS BELOW; D; GAF */
+  D, /* 06B4; GAF WITH 3 DOTS ABOVE; D; GAF */
+  D, /* 06B5; LAM WITH V ABOVE; D; LAM */
+  D, /* 06B6; LAM WITH DOT ABOVE; D; LAM */
+  D, /* 06B7; LAM WITH 3 DOTS ABOVE; D; LAM */
+  D, /* 06B8; LAM WITH 3 DOTS BELOW; D; LAM */
+  D, /* 06B9; NOON WITH DOT BELOW; D; NOON */
+  D, /* 06BA; DOTLESS NOON; D; NOON */
+  D, /* 06BB; DOTLESS NOON WITH TAH ABOVE; D; NOON */
+  D, /* 06BC; NOON WITH ATTACHED RING BELOW; D; NOON */
+  D, /* 06BD; NYA; D; NYA */
+  D, /* 06BE; KNOTTED HEH; D; KNOTTED HEH */
+  D, /* 06BF; HAH WITH 3 DOTS BELOW AND DOT ABOVE; D; HAH */
+  R, /* 06C0; DOTLESS TEH MARBUTA WITH HAMZA ABOVE; R; TEH MARBUTA */
+  D, /* 06C1; HEH GOAL; D; HEH GOAL */
+  D, /* 06C2; HEH GOAL WITH HAMZA ABOVE; D; HEH GOAL */
+  R, /* 06C3; TEH MARBUTA GOAL; R; TEH MARBUTA GOAL */
+  R, /* 06C4; WAW WITH ATTACHED RING WITHIN; R; WAW */
+  R, /* 06C5; WAW WITH BAR; R; WAW */
+  R, /* 06C6; WAW WITH V ABOVE; R; WAW */
+  R, /* 06C7; WAW WITH DAMMA ABOVE; R; WAW */
+  R, /* 06C8; WAW WITH ALEF ABOVE; R; WAW */
+  R, /* 06C9; WAW WITH INVERTED V ABOVE; R; WAW */
+  R, /* 06CA; WAW WITH 2 DOTS ABOVE; R; WAW */
+  R, /* 06CB; WAW WITH 3 DOTS ABOVE; R; WAW */
+  D, /* 06CC; FARSI YEH; D; FARSI YEH */
+  R, /* 06CD; YEH WITH TAIL; R; YEH WITH TAIL */
+  D, /* 06CE; FARSI YEH WITH V ABOVE; D; FARSI YEH */
+  R, /* 06CF; WAW WITH DOT ABOVE; R; WAW */
+  D, /* 06D0; DOTLESS YEH WITH VERTICAL 2 DOTS BELOW; D; YEH */
+  D, /* 06D1; DOTLESS YEH WITH 3 DOTS BELOW; D; YEH */
+  R, /* 06D2; YEH BARREE; R; YEH BARREE */
+  R, /* 06D3; YEH BARREE WITH HAMZA ABOVE; R; YEH BARREE */
+  X, /* 06D4 */
+  R, /* 06D5; DOTLESS TEH MARBUTA; R; TEH MARBUTA */
+  X, /* 06D6 */
+  X, /* 06D7 */
+  X, /* 06D8 */
+  X, /* 06D9 */
+  X, /* 06DA */
+  X, /* 06DB */
+  X, /* 06DC */
+  U, /* 06DD; ARABIC END OF AYAH; U; No_Joining_Group */
+  X, /* 06DE */
+  X, /* 06DF */
+  X, /* 06E0 */
+  X, /* 06E1 */
+  X, /* 06E2 */
+  X, /* 06E3 */
+  X, /* 06E4 */
+  X, /* 06E5 */
+  X, /* 06E6 */
+  X, /* 06E7 */
+  X, /* 06E8 */
+  X, /* 06E9 */
+  X, /* 06EA */
+  X, /* 06EB */
+  X, /* 06EC */
+  X, /* 06ED */
+  R, /* 06EE; DAL WITH INVERTED V ABOVE; R; DAL */
+  R, /* 06EF; REH WITH INVERTED V ABOVE; R; REH */
+  X, /* 06F0 */
+  X, /* 06F1 */
+  X, /* 06F2 */
+  X, /* 06F3 */
+  X, /* 06F4 */
+  X, /* 06F5 */
+  X, /* 06F6 */
+  X, /* 06F7 */
+  X, /* 06F8 */
+  X, /* 06F9 */
+  D, /* 06FA; SEEN WITH DOT BELOW AND 3 DOTS ABOVE; D; SEEN */
+  D, /* 06FB; SAD WITH DOT BELOW AND DOT ABOVE; D; SAD */
+  D, /* 06FC; AIN WITH DOT BELOW AND DOT ABOVE; D; AIN */
+  X, /* 06FD */
+  X, /* 06FE */
+  D, /* 06FF; KNOTTED HEH WITH INVERTED V ABOVE; D; KNOTTED HEH */
 
   /* Syriac */
 
-  JOINING_TYPE_X, /* 0700 */
-  JOINING_TYPE_X, /* 0701 */
-  JOINING_TYPE_X, /* 0702 */
-  JOINING_TYPE_X, /* 0703 */
-  JOINING_TYPE_X, /* 0704 */
-  JOINING_TYPE_X, /* 0705 */
-  JOINING_TYPE_X, /* 0706 */
-  JOINING_TYPE_X, /* 0707 */
-  JOINING_TYPE_X, /* 0708 */
-  JOINING_TYPE_X, /* 0709 */
-  JOINING_TYPE_X, /* 070A */
-  JOINING_TYPE_X, /* 070B */
-  JOINING_TYPE_X, /* 070C */
-  JOINING_TYPE_X, /* 070D */
-  JOINING_TYPE_X, /* 070E */
-  JOINING_TYPE_X, /* 070F */
-  JOINING_GROUP_ALAPH, /* 0710; ALAPH; R; ALAPH */
-  JOINING_TYPE_X, /* 0711 */
-  JOINING_TYPE_D, /* 0712; BETH; D; BETH */
-  JOINING_TYPE_D, /* 0713; GAMAL; D; GAMAL */
-  JOINING_TYPE_D, /* 0714; GAMAL GARSHUNI; D; GAMAL */
-  JOINING_GROUP_DALATH_RISH, /* 0715; DALATH; R; DALATH RISH */
-  JOINING_GROUP_DALATH_RISH, /* 0716; DOTLESS DALATH RISH; R; DALATH RISH */
-  JOINING_TYPE_R, /* 0717; HE; R; HE */
-  JOINING_TYPE_R, /* 0718; WAW; R; SYRIAC WAW */
-  JOINING_TYPE_R, /* 0719; ZAIN; R; ZAIN */
-  JOINING_TYPE_D, /* 071A; HETH; D; HETH */
-  JOINING_TYPE_D, /* 071B; TETH; D; TETH */
-  JOINING_TYPE_D, /* 071C; TETH GARSHUNI; D; TETH */
-  JOINING_TYPE_D, /* 071D; YUDH; D; YUDH */
-  JOINING_TYPE_R, /* 071E; YUDH HE; R; YUDH HE */
-  JOINING_TYPE_D, /* 071F; KAPH; D; KAPH */
-  JOINING_TYPE_D, /* 0720; LAMADH; D; LAMADH */
-  JOINING_TYPE_D, /* 0721; MIM; D; MIM */
-  JOINING_TYPE_D, /* 0722; NUN; D; NUN */
-  JOINING_TYPE_D, /* 0723; SEMKATH; D; SEMKATH */
-  JOINING_TYPE_D, /* 0724; FINAL SEMKATH; D; FINAL SEMKATH */
-  JOINING_TYPE_D, /* 0725; E; D; E */
-  JOINING_TYPE_D, /* 0726; PE; D; PE */
-  JOINING_TYPE_D, /* 0727; REVERSED PE; D; REVERSED PE */
-  JOINING_TYPE_R, /* 0728; SADHE; R; SADHE */
-  JOINING_TYPE_D, /* 0729; QAPH; D; QAPH */
-  JOINING_GROUP_DALATH_RISH, /* 072A; RISH; R; DALATH RISH */
-  JOINING_TYPE_D, /* 072B; SHIN; D; SHIN */
-  JOINING_TYPE_R, /* 072C; TAW; R; TAW */
-  JOINING_TYPE_D, /* 072D; PERSIAN BHETH; D; BETH */
-  JOINING_TYPE_D, /* 072E; PERSIAN GHAMAL; D; GAMAL */
-  JOINING_GROUP_DALATH_RISH, /* 072F; PERSIAN DHALATH; R; DALATH RISH */
-  JOINING_TYPE_X, /* 0730 */
-  JOINING_TYPE_X, /* 0731 */
-  JOINING_TYPE_X, /* 0732 */
-  JOINING_TYPE_X, /* 0733 */
-  JOINING_TYPE_X, /* 0734 */
-  JOINING_TYPE_X, /* 0735 */
-  JOINING_TYPE_X, /* 0736 */
-  JOINING_TYPE_X, /* 0737 */
-  JOINING_TYPE_X, /* 0738 */
-  JOINING_TYPE_X, /* 0739 */
-  JOINING_TYPE_X, /* 073A */
-  JOINING_TYPE_X, /* 073B */
-  JOINING_TYPE_X, /* 073C */
-  JOINING_TYPE_X, /* 073D */
-  JOINING_TYPE_X, /* 073E */
-  JOINING_TYPE_X, /* 073F */
-  JOINING_TYPE_X, /* 0740 */
-  JOINING_TYPE_X, /* 0741 */
-  JOINING_TYPE_X, /* 0742 */
-  JOINING_TYPE_X, /* 0743 */
-  JOINING_TYPE_X, /* 0744 */
-  JOINING_TYPE_X, /* 0745 */
-  JOINING_TYPE_X, /* 0746 */
-  JOINING_TYPE_X, /* 0747 */
-  JOINING_TYPE_X, /* 0748 */
-  JOINING_TYPE_X, /* 0749 */
-  JOINING_TYPE_X, /* 074A */
-  JOINING_TYPE_X, /* 074B */
-  JOINING_TYPE_X, /* 074C */
-  JOINING_TYPE_R, /* 074D; SOGDIAN ZHAIN; R; ZHAIN */
-  JOINING_TYPE_D, /* 074E; SOGDIAN KHAPH; D; KHAPH */
-  JOINING_TYPE_D, /* 074F; SOGDIAN FE; D; FE */
+  X, /* 0700 */
+  X, /* 0701 */
+  X, /* 0702 */
+  X, /* 0703 */
+  X, /* 0704 */
+  X, /* 0705 */
+  X, /* 0706 */
+  X, /* 0707 */
+  X, /* 0708 */
+  X, /* 0709 */
+  X, /* 070A */
+  X, /* 070B */
+  X, /* 070C */
+  X, /* 070D */
+  X, /* 070E */
+  X, /* 070F */
+  A, /* 0710; ALAPH; R; ALAPH */
+  X, /* 0711 */
+  D, /* 0712; BETH; D; BETH */
+  D, /* 0713; GAMAL; D; GAMAL */
+  D, /* 0714; GAMAL GARSHUNI; D; GAMAL */
+  DR, /* 0715; DALATH; R; DALATH RISH */
+  DR, /* 0716; DOTLESS DALATH RISH; R; DALATH RISH */
+  R, /* 0717; HE; R; HE */
+  R, /* 0718; WAW; R; SYRIAC WAW */
+  R, /* 0719; ZAIN; R; ZAIN */
+  D, /* 071A; HETH; D; HETH */
+  D, /* 071B; TETH; D; TETH */
+  D, /* 071C; TETH GARSHUNI; D; TETH */
+  D, /* 071D; YUDH; D; YUDH */
+  R, /* 071E; YUDH HE; R; YUDH HE */
+  D, /* 071F; KAPH; D; KAPH */
+  D, /* 0720; LAMADH; D; LAMADH */
+  D, /* 0721; MIM; D; MIM */
+  D, /* 0722; NUN; D; NUN */
+  D, /* 0723; SEMKATH; D; SEMKATH */
+  D, /* 0724; FINAL SEMKATH; D; FINAL SEMKATH */
+  D, /* 0725; E; D; E */
+  D, /* 0726; PE; D; PE */
+  D, /* 0727; REVERSED PE; D; REVERSED PE */
+  R, /* 0728; SADHE; R; SADHE */
+  D, /* 0729; QAPH; D; QAPH */
+  DR, /* 072A; RISH; R; DALATH RISH */
+  D, /* 072B; SHIN; D; SHIN */
+  R, /* 072C; TAW; R; TAW */
+  D, /* 072D; PERSIAN BHETH; D; BETH */
+  D, /* 072E; PERSIAN GHAMAL; D; GAMAL */
+  DR, /* 072F; PERSIAN DHALATH; R; DALATH RISH */
+  X, /* 0730 */
+  X, /* 0731 */
+  X, /* 0732 */
+  X, /* 0733 */
+  X, /* 0734 */
+  X, /* 0735 */
+  X, /* 0736 */
+  X, /* 0737 */
+  X, /* 0738 */
+  X, /* 0739 */
+  X, /* 073A */
+  X, /* 073B */
+  X, /* 073C */
+  X, /* 073D */
+  X, /* 073E */
+  X, /* 073F */
+  X, /* 0740 */
+  X, /* 0741 */
+  X, /* 0742 */
+  X, /* 0743 */
+  X, /* 0744 */
+  X, /* 0745 */
+  X, /* 0746 */
+  X, /* 0747 */
+  X, /* 0748 */
+  X, /* 0749 */
+  X, /* 074A */
+  X, /* 074B */
+  X, /* 074C */
+  R, /* 074D; SOGDIAN ZHAIN; R; ZHAIN */
+  D, /* 074E; SOGDIAN KHAPH; D; KHAPH */
+  D, /* 074F; SOGDIAN FE; D; FE */
 
   /* Arabic Supplement */
 
-  JOINING_TYPE_D, /* 0750; DOTLESS BEH WITH HORIZONTAL 3 DOTS BELOW; D; BEH */
-  JOINING_TYPE_D, /* 0751; BEH WITH 3 DOTS ABOVE; D; BEH */
-  JOINING_TYPE_D, /* 0752; DOTLESS BEH WITH INVERTED 3 DOTS BELOW; D; BEH */
-  JOINING_TYPE_D, /* 0753; DOTLESS BEH WITH INVERTED 3 DOTS BELOW AND 2 DOTS ABOVE; D; BEH */
-  JOINING_TYPE_D, /* 0754; DOTLESS BEH WITH 2 DOTS BELOW AND DOT ABOVE; D; BEH */
-  JOINING_TYPE_D, /* 0755; DOTLESS BEH WITH INVERTED V BELOW; D; BEH */
-  JOINING_TYPE_D, /* 0756; DOTLESS BEH WITH V ABOVE; D; BEH */
-  JOINING_TYPE_D, /* 0757; HAH WITH 2 DOTS ABOVE; D; HAH */
-  JOINING_TYPE_D, /* 0758; HAH WITH INVERTED 3 DOTS BELOW; D; HAH */
-  JOINING_TYPE_R, /* 0759; DAL WITH VERTICAL 2 DOTS BELOW AND TAH ABOVE; R; DAL */
-  JOINING_TYPE_R, /* 075A; DAL WITH INVERTED V BELOW; R; DAL */
-  JOINING_TYPE_R, /* 075B; REH WITH BAR; R; REH */
-  JOINING_TYPE_D, /* 075C; SEEN WITH 4 DOTS ABOVE; D; SEEN */
-  JOINING_TYPE_D, /* 075D; AIN WITH 2 DOTS ABOVE; D; AIN */
-  JOINING_TYPE_D, /* 075E; AIN WITH INVERTED 3 DOTS ABOVE; D; AIN */
-  JOINING_TYPE_D, /* 075F; AIN WITH VERTICAL 2 DOTS ABOVE; D; AIN */
-  JOINING_TYPE_D, /* 0760; DOTLESS FEH WITH 2 DOTS BELOW; D; FEH */
-  JOINING_TYPE_D, /* 0761; DOTLESS FEH WITH INVERTED 3 DOTS BELOW; D; FEH */
-  JOINING_TYPE_D, /* 0762; KEHEH WITH DOT ABOVE; D; GAF */
-  JOINING_TYPE_D, /* 0763; KEHEH WITH 3 DOTS ABOVE; D; GAF */
-  JOINING_TYPE_D, /* 0764; KEHEH WITH INVERTED 3 DOTS BELOW; D; GAF */
-  JOINING_TYPE_D, /* 0765; MEEM WITH DOT ABOVE; D; MEEM */
-  JOINING_TYPE_D, /* 0766; MEEM WITH DOT BELOW; D; MEEM */
-  JOINING_TYPE_D, /* 0767; NOON WITH 2 DOTS BELOW; D; NOON */
-  JOINING_TYPE_D, /* 0768; NOON WITH TAH ABOVE; D; NOON */
-  JOINING_TYPE_D, /* 0769; NOON WITH V ABOVE; D; NOON */
-  JOINING_TYPE_D, /* 076A; LAM WITH BAR; D; LAM */
-  JOINING_TYPE_R, /* 076B; REH WITH VERTICAL 2 DOTS ABOVE; R; REH */
-  JOINING_TYPE_R, /* 076C; REH WITH HAMZA ABOVE; R; REH */
-  JOINING_TYPE_D, /* 076D; SEEN WITH VERTICAL 2 DOTS ABOVE; D; SEEN */
-  JOINING_TYPE_D, /* 076E; HAH WITH TAH BELOW; D; HAH */
-  JOINING_TYPE_D, /* 076F; HAH WITH TAH AND 2 DOTS BELOW; D; HAH */
-  JOINING_TYPE_D, /* 0770; SEEN WITH 2 DOTS AND TAH ABOVE; D; SEEN */
-  JOINING_TYPE_R, /* 0771; REH WITH 2 DOTS AND TAH ABOVE; R; REH */
-  JOINING_TYPE_D, /* 0772; HAH WITH TAH ABOVE; D; HAH */
-  JOINING_TYPE_R, /* 0773; ALEF WITH DIGIT TWO ABOVE; R; ALEF */
-  JOINING_TYPE_R, /* 0774; ALEF WITH DIGIT THREE ABOVE; R; ALEF */
-  JOINING_TYPE_D, /* 0775; FARSI YEH WITH DIGIT TWO ABOVE; D; FARSI YEH */
-  JOINING_TYPE_D, /* 0776; FARSI YEH WITH DIGIT THREE ABOVE; D; FARSI YEH */
-  JOINING_TYPE_D, /* 0777; DOTLESS YEH WITH DIGIT FOUR BELOW; D; YEH */
-  JOINING_TYPE_R, /* 0778; WAW WITH DIGIT TWO ABOVE; R; WAW */
-  JOINING_TYPE_R, /* 0779; WAW WITH DIGIT THREE ABOVE; R; WAW */
-  JOINING_TYPE_D, /* 077A; BURUSHASKI YEH BARREE WITH DIGIT TWO ABOVE; D; BURUSHASKI YEH BARREE */
-  JOINING_TYPE_D, /* 077B; BURUSHASKI YEH BARREE WITH DIGIT THREE ABOVE; D; BURUSHASKI YEH BARREE */
-  JOINING_TYPE_D, /* 077C; HAH WITH DIGIT FOUR BELOW; D; HAH */
-  JOINING_TYPE_D, /* 077D; SEEN WITH DIGIT FOUR ABOVE; D; SEEN */
-  JOINING_TYPE_D, /* 077E; SEEN WITH INVERTED V ABOVE; D; SEEN */
-  JOINING_TYPE_D, /* 077F; KAF WITH 2 DOTS ABOVE; D; KAF */
+  D, /* 0750; DOTLESS BEH WITH HORIZONTAL 3 DOTS BELOW; D; BEH */
+  D, /* 0751; BEH WITH 3 DOTS ABOVE; D; BEH */
+  D, /* 0752; DOTLESS BEH WITH INVERTED 3 DOTS BELOW; D; BEH */
+  D, /* 0753; DOTLESS BEH WITH INVERTED 3 DOTS BELOW AND 2 DOTS ABOVE; D; BEH */
+  D, /* 0754; DOTLESS BEH WITH 2 DOTS BELOW AND DOT ABOVE; D; BEH */
+  D, /* 0755; DOTLESS BEH WITH INVERTED V BELOW; D; BEH */
+  D, /* 0756; DOTLESS BEH WITH V ABOVE; D; BEH */
+  D, /* 0757; HAH WITH 2 DOTS ABOVE; D; HAH */
+  D, /* 0758; HAH WITH INVERTED 3 DOTS BELOW; D; HAH */
+  R, /* 0759; DAL WITH VERTICAL 2 DOTS BELOW AND TAH ABOVE; R; DAL */
+  R, /* 075A; DAL WITH INVERTED V BELOW; R; DAL */
+  R, /* 075B; REH WITH BAR; R; REH */
+  D, /* 075C; SEEN WITH 4 DOTS ABOVE; D; SEEN */
+  D, /* 075D; AIN WITH 2 DOTS ABOVE; D; AIN */
+  D, /* 075E; AIN WITH INVERTED 3 DOTS ABOVE; D; AIN */
+  D, /* 075F; AIN WITH VERTICAL 2 DOTS ABOVE; D; AIN */
+  D, /* 0760; DOTLESS FEH WITH 2 DOTS BELOW; D; FEH */
+  D, /* 0761; DOTLESS FEH WITH INVERTED 3 DOTS BELOW; D; FEH */
+  D, /* 0762; KEHEH WITH DOT ABOVE; D; GAF */
+  D, /* 0763; KEHEH WITH 3 DOTS ABOVE; D; GAF */
+  D, /* 0764; KEHEH WITH INVERTED 3 DOTS BELOW; D; GAF */
+  D, /* 0765; MEEM WITH DOT ABOVE; D; MEEM */
+  D, /* 0766; MEEM WITH DOT BELOW; D; MEEM */
+  D, /* 0767; NOON WITH 2 DOTS BELOW; D; NOON */
+  D, /* 0768; NOON WITH TAH ABOVE; D; NOON */
+  D, /* 0769; NOON WITH V ABOVE; D; NOON */
+  D, /* 076A; LAM WITH BAR; D; LAM */
+  R, /* 076B; REH WITH VERTICAL 2 DOTS ABOVE; R; REH */
+  R, /* 076C; REH WITH HAMZA ABOVE; R; REH */
+  D, /* 076D; SEEN WITH VERTICAL 2 DOTS ABOVE; D; SEEN */
+  D, /* 076E; HAH WITH TAH BELOW; D; HAH */
+  D, /* 076F; HAH WITH TAH AND 2 DOTS BELOW; D; HAH */
+  D, /* 0770; SEEN WITH 2 DOTS AND TAH ABOVE; D; SEEN */
+  R, /* 0771; REH WITH 2 DOTS AND TAH ABOVE; R; REH */
+  D, /* 0772; HAH WITH TAH ABOVE; D; HAH */
+  R, /* 0773; ALEF WITH DIGIT TWO ABOVE; R; ALEF */
+  R, /* 0774; ALEF WITH DIGIT THREE ABOVE; R; ALEF */
+  D, /* 0775; FARSI YEH WITH DIGIT TWO ABOVE; D; FARSI YEH */
+  D, /* 0776; FARSI YEH WITH DIGIT THREE ABOVE; D; FARSI YEH */
+  D, /* 0777; DOTLESS YEH WITH DIGIT FOUR BELOW; D; YEH */
+  R, /* 0778; WAW WITH DIGIT TWO ABOVE; R; WAW */
+  R, /* 0779; WAW WITH DIGIT THREE ABOVE; R; WAW */
+  D, /* 077A; BURUSHASKI YEH BARREE WITH DIGIT TWO ABOVE; D; BURUSHASKI YEH BARREE */
+  D, /* 077B; BURUSHASKI YEH BARREE WITH DIGIT THREE ABOVE; D; BURUSHASKI YEH BARREE */
+  D, /* 077C; HAH WITH DIGIT FOUR BELOW; D; HAH */
+  D, /* 077D; SEEN WITH DIGIT FOUR ABOVE; D; SEEN */
+  D, /* 077E; SEEN WITH INVERTED V ABOVE; D; SEEN */
+  D, /* 077F; KAF WITH 2 DOTS ABOVE; D; KAF */
 
   /* Thaana */
 
-  JOINING_TYPE_X, /* 0780 */
-  JOINING_TYPE_X, /* 0781 */
-  JOINING_TYPE_X, /* 0782 */
-  JOINING_TYPE_X, /* 0783 */
-  JOINING_TYPE_X, /* 0784 */
-  JOINING_TYPE_X, /* 0785 */
-  JOINING_TYPE_X, /* 0786 */
-  JOINING_TYPE_X, /* 0787 */
-  JOINING_TYPE_X, /* 0788 */
-  JOINING_TYPE_X, /* 0789 */
-  JOINING_TYPE_X, /* 078A */
-  JOINING_TYPE_X, /* 078B */
-  JOINING_TYPE_X, /* 078C */
-  JOINING_TYPE_X, /* 078D */
-  JOINING_TYPE_X, /* 078E */
-  JOINING_TYPE_X, /* 078F */
-  JOINING_TYPE_X, /* 0790 */
-  JOINING_TYPE_X, /* 0791 */
-  JOINING_TYPE_X, /* 0792 */
-  JOINING_TYPE_X, /* 0793 */
-  JOINING_TYPE_X, /* 0794 */
-  JOINING_TYPE_X, /* 0795 */
-  JOINING_TYPE_X, /* 0796 */
-  JOINING_TYPE_X, /* 0797 */
-  JOINING_TYPE_X, /* 0798 */
-  JOINING_TYPE_X, /* 0799 */
-  JOINING_TYPE_X, /* 079A */
-  JOINING_TYPE_X, /* 079B */
-  JOINING_TYPE_X, /* 079C */
-  JOINING_TYPE_X, /* 079D */
-  JOINING_TYPE_X, /* 079E */
-  JOINING_TYPE_X, /* 079F */
-  JOINING_TYPE_X, /* 07A0 */
-  JOINING_TYPE_X, /* 07A1 */
-  JOINING_TYPE_X, /* 07A2 */
-  JOINING_TYPE_X, /* 07A3 */
-  JOINING_TYPE_X, /* 07A4 */
-  JOINING_TYPE_X, /* 07A5 */
-  JOINING_TYPE_X, /* 07A6 */
-  JOINING_TYPE_X, /* 07A7 */
-  JOINING_TYPE_X, /* 07A8 */
-  JOINING_TYPE_X, /* 07A9 */
-  JOINING_TYPE_X, /* 07AA */
-  JOINING_TYPE_X, /* 07AB */
-  JOINING_TYPE_X, /* 07AC */
-  JOINING_TYPE_X, /* 07AD */
-  JOINING_TYPE_X, /* 07AE */
-  JOINING_TYPE_X, /* 07AF */
-  JOINING_TYPE_X, /* 07B0 */
-  JOINING_TYPE_X, /* 07B1 */
-  JOINING_TYPE_X, /* 07B2 */
-  JOINING_TYPE_X, /* 07B3 */
-  JOINING_TYPE_X, /* 07B4 */
-  JOINING_TYPE_X, /* 07B5 */
-  JOINING_TYPE_X, /* 07B6 */
-  JOINING_TYPE_X, /* 07B7 */
-  JOINING_TYPE_X, /* 07B8 */
-  JOINING_TYPE_X, /* 07B9 */
-  JOINING_TYPE_X, /* 07BA */
-  JOINING_TYPE_X, /* 07BB */
-  JOINING_TYPE_X, /* 07BC */
-  JOINING_TYPE_X, /* 07BD */
-  JOINING_TYPE_X, /* 07BE */
-  JOINING_TYPE_X, /* 07BF */
+  X, /* 0780 */
+  X, /* 0781 */
+  X, /* 0782 */
+  X, /* 0783 */
+  X, /* 0784 */
+  X, /* 0785 */
+  X, /* 0786 */
+  X, /* 0787 */
+  X, /* 0788 */
+  X, /* 0789 */
+  X, /* 078A */
+  X, /* 078B */
+  X, /* 078C */
+  X, /* 078D */
+  X, /* 078E */
+  X, /* 078F */
+  X, /* 0790 */
+  X, /* 0791 */
+  X, /* 0792 */
+  X, /* 0793 */
+  X, /* 0794 */
+  X, /* 0795 */
+  X, /* 0796 */
+  X, /* 0797 */
+  X, /* 0798 */
+  X, /* 0799 */
+  X, /* 079A */
+  X, /* 079B */
+  X, /* 079C */
+  X, /* 079D */
+  X, /* 079E */
+  X, /* 079F */
+  X, /* 07A0 */
+  X, /* 07A1 */
+  X, /* 07A2 */
+  X, /* 07A3 */
+  X, /* 07A4 */
+  X, /* 07A5 */
+  X, /* 07A6 */
+  X, /* 07A7 */
+  X, /* 07A8 */
+  X, /* 07A9 */
+  X, /* 07AA */
+  X, /* 07AB */
+  X, /* 07AC */
+  X, /* 07AD */
+  X, /* 07AE */
+  X, /* 07AF */
+  X, /* 07B0 */
+  X, /* 07B1 */
+  X, /* 07B2 */
+  X, /* 07B3 */
+  X, /* 07B4 */
+  X, /* 07B5 */
+  X, /* 07B6 */
+  X, /* 07B7 */
+  X, /* 07B8 */
+  X, /* 07B9 */
+  X, /* 07BA */
+  X, /* 07BB */
+  X, /* 07BC */
+  X, /* 07BD */
+  X, /* 07BE */
+  X, /* 07BF */
 
   /* NKo */
 
-  JOINING_TYPE_X, /* 07C0 */
-  JOINING_TYPE_X, /* 07C1 */
-  JOINING_TYPE_X, /* 07C2 */
-  JOINING_TYPE_X, /* 07C3 */
-  JOINING_TYPE_X, /* 07C4 */
-  JOINING_TYPE_X, /* 07C5 */
-  JOINING_TYPE_X, /* 07C6 */
-  JOINING_TYPE_X, /* 07C7 */
-  JOINING_TYPE_X, /* 07C8 */
-  JOINING_TYPE_X, /* 07C9 */
-  JOINING_TYPE_D, /* 07CA; NKO A; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07CB; NKO EE; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07CC; NKO I; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07CD; NKO E; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07CE; NKO U; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07CF; NKO OO; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07D0; NKO O; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07D1; NKO DAGBASINNA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07D2; NKO N; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07D3; NKO BA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07D4; NKO PA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07D5; NKO TA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07D6; NKO JA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07D7; NKO CHA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07D8; NKO DA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07D9; NKO RA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07DA; NKO RRA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07DB; NKO SA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07DC; NKO GBA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07DD; NKO FA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07DE; NKO KA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07DF; NKO LA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07E0; NKO NA WOLOSO; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07E1; NKO MA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07E2; NKO NYA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07E3; NKO NA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07E4; NKO HA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07E5; NKO WA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07E6; NKO YA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07E7; NKO NYA WOLOSO; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07E8; NKO JONA JA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07E9; NKO JONA CHA; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 07EA; NKO JONA RA; D; No_Joining_Group */
-  JOINING_TYPE_X, /* 07EB */
-  JOINING_TYPE_X, /* 07EC */
-  JOINING_TYPE_X, /* 07ED */
-  JOINING_TYPE_X, /* 07EE */
-  JOINING_TYPE_X, /* 07EF */
-  JOINING_TYPE_X, /* 07F0 */
-  JOINING_TYPE_X, /* 07F1 */
-  JOINING_TYPE_X, /* 07F2 */
-  JOINING_TYPE_X, /* 07F3 */
-  JOINING_TYPE_X, /* 07F4 */
-  JOINING_TYPE_X, /* 07F5 */
-  JOINING_TYPE_X, /* 07F6 */
-  JOINING_TYPE_X, /* 07F7 */
-  JOINING_TYPE_X, /* 07F8 */
-  JOINING_TYPE_X, /* 07F9 */
-  JOINING_TYPE_C, /* 07FA; NKO LAJANYALAN; C; No_Joining_Group */
-  JOINING_TYPE_X, /* 07FB */
-  JOINING_TYPE_X, /* 07FC */
-  JOINING_TYPE_X, /* 07FD */
-  JOINING_TYPE_X, /* 07FE */
-  JOINING_TYPE_X, /* 07FF */
+  X, /* 07C0 */
+  X, /* 07C1 */
+  X, /* 07C2 */
+  X, /* 07C3 */
+  X, /* 07C4 */
+  X, /* 07C5 */
+  X, /* 07C6 */
+  X, /* 07C7 */
+  X, /* 07C8 */
+  X, /* 07C9 */
+  D, /* 07CA; NKO A; D; No_Joining_Group */
+  D, /* 07CB; NKO EE; D; No_Joining_Group */
+  D, /* 07CC; NKO I; D; No_Joining_Group */
+  D, /* 07CD; NKO E; D; No_Joining_Group */
+  D, /* 07CE; NKO U; D; No_Joining_Group */
+  D, /* 07CF; NKO OO; D; No_Joining_Group */
+  D, /* 07D0; NKO O; D; No_Joining_Group */
+  D, /* 07D1; NKO DAGBASINNA; D; No_Joining_Group */
+  D, /* 07D2; NKO N; D; No_Joining_Group */
+  D, /* 07D3; NKO BA; D; No_Joining_Group */
+  D, /* 07D4; NKO PA; D; No_Joining_Group */
+  D, /* 07D5; NKO TA; D; No_Joining_Group */
+  D, /* 07D6; NKO JA; D; No_Joining_Group */
+  D, /* 07D7; NKO CHA; D; No_Joining_Group */
+  D, /* 07D8; NKO DA; D; No_Joining_Group */
+  D, /* 07D9; NKO RA; D; No_Joining_Group */
+  D, /* 07DA; NKO RRA; D; No_Joining_Group */
+  D, /* 07DB; NKO SA; D; No_Joining_Group */
+  D, /* 07DC; NKO GBA; D; No_Joining_Group */
+  D, /* 07DD; NKO FA; D; No_Joining_Group */
+  D, /* 07DE; NKO KA; D; No_Joining_Group */
+  D, /* 07DF; NKO LA; D; No_Joining_Group */
+  D, /* 07E0; NKO NA WOLOSO; D; No_Joining_Group */
+  D, /* 07E1; NKO MA; D; No_Joining_Group */
+  D, /* 07E2; NKO NYA; D; No_Joining_Group */
+  D, /* 07E3; NKO NA; D; No_Joining_Group */
+  D, /* 07E4; NKO HA; D; No_Joining_Group */
+  D, /* 07E5; NKO WA; D; No_Joining_Group */
+  D, /* 07E6; NKO YA; D; No_Joining_Group */
+  D, /* 07E7; NKO NYA WOLOSO; D; No_Joining_Group */
+  D, /* 07E8; NKO JONA JA; D; No_Joining_Group */
+  D, /* 07E9; NKO JONA CHA; D; No_Joining_Group */
+  D, /* 07EA; NKO JONA RA; D; No_Joining_Group */
+  X, /* 07EB */
+  X, /* 07EC */
+  X, /* 07ED */
+  X, /* 07EE */
+  X, /* 07EF */
+  X, /* 07F0 */
+  X, /* 07F1 */
+  X, /* 07F2 */
+  X, /* 07F3 */
+  X, /* 07F4 */
+  X, /* 07F5 */
+  X, /* 07F6 */
+  X, /* 07F7 */
+  X, /* 07F8 */
+  X, /* 07F9 */
+  C, /* 07FA; NKO LAJANYALAN; C; No_Joining_Group */
+  X, /* 07FB */
+  X, /* 07FC */
+  X, /* 07FD */
+  X, /* 07FE */
+  X, /* 07FF */
 
   /* Samaritan */
 
-  JOINING_TYPE_X, /* 0800 */
-  JOINING_TYPE_X, /* 0801 */
-  JOINING_TYPE_X, /* 0802 */
-  JOINING_TYPE_X, /* 0803 */
-  JOINING_TYPE_X, /* 0804 */
-  JOINING_TYPE_X, /* 0805 */
-  JOINING_TYPE_X, /* 0806 */
-  JOINING_TYPE_X, /* 0807 */
-  JOINING_TYPE_X, /* 0808 */
-  JOINING_TYPE_X, /* 0809 */
-  JOINING_TYPE_X, /* 080A */
-  JOINING_TYPE_X, /* 080B */
-  JOINING_TYPE_X, /* 080C */
-  JOINING_TYPE_X, /* 080D */
-  JOINING_TYPE_X, /* 080E */
-  JOINING_TYPE_X, /* 080F */
-  JOINING_TYPE_X, /* 0810 */
-  JOINING_TYPE_X, /* 0811 */
-  JOINING_TYPE_X, /* 0812 */
-  JOINING_TYPE_X, /* 0813 */
-  JOINING_TYPE_X, /* 0814 */
-  JOINING_TYPE_X, /* 0815 */
-  JOINING_TYPE_X, /* 0816 */
-  JOINING_TYPE_X, /* 0817 */
-  JOINING_TYPE_X, /* 0818 */
-  JOINING_TYPE_X, /* 0819 */
-  JOINING_TYPE_X, /* 081A */
-  JOINING_TYPE_X, /* 081B */
-  JOINING_TYPE_X, /* 081C */
-  JOINING_TYPE_X, /* 081D */
-  JOINING_TYPE_X, /* 081E */
-  JOINING_TYPE_X, /* 081F */
-  JOINING_TYPE_X, /* 0820 */
-  JOINING_TYPE_X, /* 0821 */
-  JOINING_TYPE_X, /* 0822 */
-  JOINING_TYPE_X, /* 0823 */
-  JOINING_TYPE_X, /* 0824 */
-  JOINING_TYPE_X, /* 0825 */
-  JOINING_TYPE_X, /* 0826 */
-  JOINING_TYPE_X, /* 0827 */
-  JOINING_TYPE_X, /* 0828 */
-  JOINING_TYPE_X, /* 0829 */
-  JOINING_TYPE_X, /* 082A */
-  JOINING_TYPE_X, /* 082B */
-  JOINING_TYPE_X, /* 082C */
-  JOINING_TYPE_X, /* 082D */
-  JOINING_TYPE_X, /* 082E */
-  JOINING_TYPE_X, /* 082F */
-  JOINING_TYPE_X, /* 0830 */
-  JOINING_TYPE_X, /* 0831 */
-  JOINING_TYPE_X, /* 0832 */
-  JOINING_TYPE_X, /* 0833 */
-  JOINING_TYPE_X, /* 0834 */
-  JOINING_TYPE_X, /* 0835 */
-  JOINING_TYPE_X, /* 0836 */
-  JOINING_TYPE_X, /* 0837 */
-  JOINING_TYPE_X, /* 0838 */
-  JOINING_TYPE_X, /* 0839 */
-  JOINING_TYPE_X, /* 083A */
-  JOINING_TYPE_X, /* 083B */
-  JOINING_TYPE_X, /* 083C */
-  JOINING_TYPE_X, /* 083D */
-  JOINING_TYPE_X, /* 083E */
-  JOINING_TYPE_X, /* 083F */
+  X, /* 0800 */
+  X, /* 0801 */
+  X, /* 0802 */
+  X, /* 0803 */
+  X, /* 0804 */
+  X, /* 0805 */
+  X, /* 0806 */
+  X, /* 0807 */
+  X, /* 0808 */
+  X, /* 0809 */
+  X, /* 080A */
+  X, /* 080B */
+  X, /* 080C */
+  X, /* 080D */
+  X, /* 080E */
+  X, /* 080F */
+  X, /* 0810 */
+  X, /* 0811 */
+  X, /* 0812 */
+  X, /* 0813 */
+  X, /* 0814 */
+  X, /* 0815 */
+  X, /* 0816 */
+  X, /* 0817 */
+  X, /* 0818 */
+  X, /* 0819 */
+  X, /* 081A */
+  X, /* 081B */
+  X, /* 081C */
+  X, /* 081D */
+  X, /* 081E */
+  X, /* 081F */
+  X, /* 0820 */
+  X, /* 0821 */
+  X, /* 0822 */
+  X, /* 0823 */
+  X, /* 0824 */
+  X, /* 0825 */
+  X, /* 0826 */
+  X, /* 0827 */
+  X, /* 0828 */
+  X, /* 0829 */
+  X, /* 082A */
+  X, /* 082B */
+  X, /* 082C */
+  X, /* 082D */
+  X, /* 082E */
+  X, /* 082F */
+  X, /* 0830 */
+  X, /* 0831 */
+  X, /* 0832 */
+  X, /* 0833 */
+  X, /* 0834 */
+  X, /* 0835 */
+  X, /* 0836 */
+  X, /* 0837 */
+  X, /* 0838 */
+  X, /* 0839 */
+  X, /* 083A */
+  X, /* 083B */
+  X, /* 083C */
+  X, /* 083D */
+  X, /* 083E */
+  X, /* 083F */
 
   /* Mandaic */
 
-  JOINING_TYPE_R, /* 0840; MANDAIC HALQA; R; No_Joining_Group */
-  JOINING_TYPE_D, /* 0841; MANDAIC AB; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 0842; MANDAIC AG; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 0843; MANDAIC AD; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 0844; MANDAIC AH; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 0845; MANDAIC USHENNA; D; No_Joining_Group */
-  JOINING_TYPE_R, /* 0846; MANDAIC AZ; R; No_Joining_Group */
-  JOINING_TYPE_D, /* 0847; MANDAIC IT; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 0848; MANDAIC ATT; D; No_Joining_Group */
-  JOINING_TYPE_R, /* 0849; MANDAIC AKSA; R; No_Joining_Group */
-  JOINING_TYPE_D, /* 084A; MANDAIC AK; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 084B; MANDAIC AL; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 084C; MANDAIC AM; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 084D; MANDAIC AN; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 084E; MANDAIC AS; D; No_Joining_Group */
-  JOINING_TYPE_R, /* 084F; MANDAIC IN; R; No_Joining_Group */
-  JOINING_TYPE_D, /* 0850; MANDAIC AP; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 0851; MANDAIC ASZ; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 0852; MANDAIC AQ; D; No_Joining_Group */
-  JOINING_TYPE_D, /* 0853; MANDAIC AR; D; No_Joining_Group */
-  JOINING_TYPE_R, /* 0854; MANDAIC ASH; R; No_Joining_Group */
-  JOINING_TYPE_D, /* 0855; MANDAIC AT; D; No_Joining_Group */
-  JOINING_TYPE_U, /* 0856; MANDAIC DUSHENNA; U; No_Joining_Group */
-  JOINING_TYPE_U, /* 0857; MANDAIC KAD; U; No_Joining_Group */
-  JOINING_TYPE_U, /* 0858; MANDAIC AIN; U; No_Joining_Group */
-  JOINING_TYPE_X, /* 0859 */
-  JOINING_TYPE_X, /* 085A */
-  JOINING_TYPE_X, /* 085B */
-  JOINING_TYPE_X, /* 085C */
-  JOINING_TYPE_X, /* 085D */
-  JOINING_TYPE_X, /* 085E */
-  JOINING_TYPE_X, /* 085F */
-  JOINING_TYPE_X, /* 0860 */
-  JOINING_TYPE_X, /* 0861 */
-  JOINING_TYPE_X, /* 0862 */
-  JOINING_TYPE_X, /* 0863 */
-  JOINING_TYPE_X, /* 0864 */
-  JOINING_TYPE_X, /* 0865 */
-  JOINING_TYPE_X, /* 0866 */
-  JOINING_TYPE_X, /* 0867 */
-  JOINING_TYPE_X, /* 0868 */
-  JOINING_TYPE_X, /* 0869 */
-  JOINING_TYPE_X, /* 086A */
-  JOINING_TYPE_X, /* 086B */
-  JOINING_TYPE_X, /* 086C */
-  JOINING_TYPE_X, /* 086D */
-  JOINING_TYPE_X, /* 086E */
-  JOINING_TYPE_X, /* 086F */
-  JOINING_TYPE_X, /* 0870 */
-  JOINING_TYPE_X, /* 0871 */
-  JOINING_TYPE_X, /* 0872 */
-  JOINING_TYPE_X, /* 0873 */
-  JOINING_TYPE_X, /* 0874 */
-  JOINING_TYPE_X, /* 0875 */
-  JOINING_TYPE_X, /* 0876 */
-  JOINING_TYPE_X, /* 0877 */
-  JOINING_TYPE_X, /* 0878 */
-  JOINING_TYPE_X, /* 0879 */
-  JOINING_TYPE_X, /* 087A */
-  JOINING_TYPE_X, /* 087B */
-  JOINING_TYPE_X, /* 087C */
-  JOINING_TYPE_X, /* 087D */
-  JOINING_TYPE_X, /* 087E */
-  JOINING_TYPE_X, /* 087F */
-  JOINING_TYPE_X, /* 0880 */
-  JOINING_TYPE_X, /* 0881 */
-  JOINING_TYPE_X, /* 0882 */
-  JOINING_TYPE_X, /* 0883 */
-  JOINING_TYPE_X, /* 0884 */
-  JOINING_TYPE_X, /* 0885 */
-  JOINING_TYPE_X, /* 0886 */
-  JOINING_TYPE_X, /* 0887 */
-  JOINING_TYPE_X, /* 0888 */
-  JOINING_TYPE_X, /* 0889 */
-  JOINING_TYPE_X, /* 088A */
-  JOINING_TYPE_X, /* 088B */
-  JOINING_TYPE_X, /* 088C */
-  JOINING_TYPE_X, /* 088D */
-  JOINING_TYPE_X, /* 088E */
-  JOINING_TYPE_X, /* 088F */
-  JOINING_TYPE_X, /* 0890 */
-  JOINING_TYPE_X, /* 0891 */
-  JOINING_TYPE_X, /* 0892 */
-  JOINING_TYPE_X, /* 0893 */
-  JOINING_TYPE_X, /* 0894 */
-  JOINING_TYPE_X, /* 0895 */
-  JOINING_TYPE_X, /* 0896 */
-  JOINING_TYPE_X, /* 0897 */
-  JOINING_TYPE_X, /* 0898 */
-  JOINING_TYPE_X, /* 0899 */
-  JOINING_TYPE_X, /* 089A */
-  JOINING_TYPE_X, /* 089B */
-  JOINING_TYPE_X, /* 089C */
-  JOINING_TYPE_X, /* 089D */
-  JOINING_TYPE_X, /* 089E */
-  JOINING_TYPE_X, /* 089F */
+  R, /* 0840; MANDAIC HALQA; R; No_Joining_Group */
+  D, /* 0841; MANDAIC AB; D; No_Joining_Group */
+  D, /* 0842; MANDAIC AG; D; No_Joining_Group */
+  D, /* 0843; MANDAIC AD; D; No_Joining_Group */
+  D, /* 0844; MANDAIC AH; D; No_Joining_Group */
+  D, /* 0845; MANDAIC USHENNA; D; No_Joining_Group */
+  R, /* 0846; MANDAIC AZ; R; No_Joining_Group */
+  D, /* 0847; MANDAIC IT; D; No_Joining_Group */
+  D, /* 0848; MANDAIC ATT; D; No_Joining_Group */
+  R, /* 0849; MANDAIC AKSA; R; No_Joining_Group */
+  D, /* 084A; MANDAIC AK; D; No_Joining_Group */
+  D, /* 084B; MANDAIC AL; D; No_Joining_Group */
+  D, /* 084C; MANDAIC AM; D; No_Joining_Group */
+  D, /* 084D; MANDAIC AN; D; No_Joining_Group */
+  D, /* 084E; MANDAIC AS; D; No_Joining_Group */
+  R, /* 084F; MANDAIC IN; R; No_Joining_Group */
+  D, /* 0850; MANDAIC AP; D; No_Joining_Group */
+  D, /* 0851; MANDAIC ASZ; D; No_Joining_Group */
+  D, /* 0852; MANDAIC AQ; D; No_Joining_Group */
+  D, /* 0853; MANDAIC AR; D; No_Joining_Group */
+  R, /* 0854; MANDAIC ASH; R; No_Joining_Group */
+  D, /* 0855; MANDAIC AT; D; No_Joining_Group */
+  U, /* 0856; MANDAIC DUSHENNA; U; No_Joining_Group */
+  U, /* 0857; MANDAIC KAD; U; No_Joining_Group */
+  U, /* 0858; MANDAIC AIN; U; No_Joining_Group */
+  X, /* 0859 */
+  X, /* 085A */
+  X, /* 085B */
+  X, /* 085C */
+  X, /* 085D */
+  X, /* 085E */
+  X, /* 085F */
+  X, /* 0860 */
+  X, /* 0861 */
+  X, /* 0862 */
+  X, /* 0863 */
+  X, /* 0864 */
+  X, /* 0865 */
+  X, /* 0866 */
+  X, /* 0867 */
+  X, /* 0868 */
+  X, /* 0869 */
+  X, /* 086A */
+  X, /* 086B */
+  X, /* 086C */
+  X, /* 086D */
+  X, /* 086E */
+  X, /* 086F */
+  X, /* 0870 */
+  X, /* 0871 */
+  X, /* 0872 */
+  X, /* 0873 */
+  X, /* 0874 */
+  X, /* 0875 */
+  X, /* 0876 */
+  X, /* 0877 */
+  X, /* 0878 */
+  X, /* 0879 */
+  X, /* 087A */
+  X, /* 087B */
+  X, /* 087C */
+  X, /* 087D */
+  X, /* 087E */
+  X, /* 087F */
+  X, /* 0880 */
+  X, /* 0881 */
+  X, /* 0882 */
+  X, /* 0883 */
+  X, /* 0884 */
+  X, /* 0885 */
+  X, /* 0886 */
+  X, /* 0887 */
+  X, /* 0888 */
+  X, /* 0889 */
+  X, /* 088A */
+  X, /* 088B */
+  X, /* 088C */
+  X, /* 088D */
+  X, /* 088E */
+  X, /* 088F */
+  X, /* 0890 */
+  X, /* 0891 */
+  X, /* 0892 */
+  X, /* 0893 */
+  X, /* 0894 */
+  X, /* 0895 */
+  X, /* 0896 */
+  X, /* 0897 */
+  X, /* 0898 */
+  X, /* 0899 */
+  X, /* 089A */
+  X, /* 089B */
+  X, /* 089C */
+  X, /* 089D */
+  X, /* 089E */
+  X, /* 089F */
 
   /* Arabic Extended-A */
 
-  JOINING_TYPE_D, /* 08A0; DOTLESS BEH WITH V BELOW; D; BEH */
-  JOINING_TYPE_X, /* 08A1 */
-  JOINING_TYPE_D, /* 08A2; HAH WITH DOT BELOW AND 2 DOTS ABOVE; D; HAH */
-  JOINING_TYPE_D, /* 08A3; TAH WITH 2 DOTS ABOVE; D; TAH */
-  JOINING_TYPE_D, /* 08A4; DOTLESS FEH WITH DOT BELOW AND 3 DOTS ABOVE; D; FEH */
-  JOINING_TYPE_D, /* 08A5; QAF WITH DOT BELOW; D; QAF */
-  JOINING_TYPE_D, /* 08A6; LAM WITH DOUBLE BAR; D; LAM */
-  JOINING_TYPE_D, /* 08A7; MEEM WITH 3 DOTS ABOVE; D; MEEM */
-  JOINING_TYPE_D, /* 08A8; YEH WITH HAMZA ABOVE; D; YEH */
-  JOINING_TYPE_D, /* 08A9; YEH WITH DOT ABOVE; D; YEH */
-  JOINING_TYPE_R, /* 08AA; REH WITH LOOP; R; REH */
-  JOINING_TYPE_R, /* 08AB; WAW WITH DOT WITHIN; R; WAW */
-  JOINING_TYPE_R, /* 08AC; ROHINGYA YEH; R; ROHINGYA YEH */
+  D, /* 08A0; DOTLESS BEH WITH V BELOW; D; BEH */
+  X, /* 08A1 */
+  D, /* 08A2; HAH WITH DOT BELOW AND 2 DOTS ABOVE; D; HAH */
+  D, /* 08A3; TAH WITH 2 DOTS ABOVE; D; TAH */
+  D, /* 08A4; DOTLESS FEH WITH DOT BELOW AND 3 DOTS ABOVE; D; FEH */
+  D, /* 08A5; QAF WITH DOT BELOW; D; QAF */
+  D, /* 08A6; LAM WITH DOUBLE BAR; D; LAM */
+  D, /* 08A7; MEEM WITH 3 DOTS ABOVE; D; MEEM */
+  D, /* 08A8; YEH WITH HAMZA ABOVE; D; YEH */
+  D, /* 08A9; YEH WITH DOT ABOVE; D; YEH */
+  R, /* 08AA; REH WITH LOOP; R; REH */
+  R, /* 08AB; WAW WITH DOT WITHIN; R; WAW */
+  R, /* 08AC; ROHINGYA YEH; R; ROHINGYA YEH */
 
 };
 
 #define JOINING_TABLE_FIRST	0x0600
 #define JOINING_TABLE_LAST	0x08AC
 
+#undef X
+#undef R
+#undef U
+#undef A
+#undef DR
+#undef C
+#undef D
+
 
 static const uint16_t shaping_table[][4] =
 {
commit 3f5327a41efcf50f64d9498ef3dfd6875ef6a5ab
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Jun 20 16:17:42 2014 -0400

    [arabic-table] Read Blocks.txt and shuffle code around
    
    No functional change.

diff --git a/src/Makefile.am b/src/Makefile.am
index f670e27..5832f75 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -281,7 +281,7 @@ indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt
 	mv hb-ot-shape-complex-indic-table.cc.tmp $(srcdir)/hb-ot-shape-complex-indic-table.cc || \
 	($(RM) hb-ot-shape-complex-indic-table.cc.tmp; false)
 
-arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt
+arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
 	$(AM_V_GEN) $(builddir)/$^ > hb-ot-shape-complex-arabic-table.hh.tmp && \
 	mv hb-ot-shape-complex-arabic-table.hh.tmp $(srcdir)/hb-ot-shape-complex-arabic-table.hh || \
 	($(RM) hb-ot-shape-complex-arabic-table.hh.tmp; false)
diff --git a/src/gen-arabic-table.py b/src/gen-arabic-table.py
index da5a4fc..534f560 100755
--- a/src/gen-arabic-table.py
+++ b/src/gen-arabic-table.py
@@ -3,34 +3,48 @@
 import sys
 import os.path
 
-if len (sys.argv) != 3:
-	print >>sys.stderr, "usage: ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt"
+if len (sys.argv) != 4:
+	print >>sys.stderr, "usage: ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt"
 	sys.exit (1)
 
 files = [file (x) for x in sys.argv[1:]]
 
-headers = [[files[0].readline (), files[0].readline ()]]
+headers = [[files[0].readline (), files[0].readline ()], [files[2].readline (), files[2].readline ()]]
 headers.append (["UnicodeData.txt does not have a header."])
 while files[0].readline ().find ('##################') < 0:
 	pass
 
+blocks = {}
+def read_blocks(f):
+	global blocks
+	for line in f:
 
-def print_joining_table(f):
+		j = line.find ('#')
+		if j >= 0:
+			line = line[:j]
 
-	print
-	print "static const uint8_t joining_table[] ="
-	print "{"
+		fields = [x.strip () for x in line.split (';')]
+		if len (fields) == 1:
+			continue
+
+		uu = fields[0].split ('..')
+		start = int (uu[0], 16)
+		if len (uu) == 1:
+			end = start
+		else:
+			end = int (uu[1], 16)
 
-	min_u = 0x110000
-	max_u = 0
-	num = 0
-	last = -1
-	block = ''
+		t = fields[1]
+
+		for u in range (start, end + 1):
+			blocks[u] = t
+
+def print_joining_table(f):
+
+	values = {}
 	for line in f:
 
 		if line[0] == '#':
-			if line.find (" characters"):
-				block = line[2:].strip ()
 			continue
 
 		fields = [x.strip () for x in line.split (';')]
@@ -40,30 +54,29 @@ def print_joining_table(f):
 		u = int (fields[0], 16)
 		if u == 0x200C or u == 0x200D:
 			continue
-		if u < last:
-			raise Exception ("Input data character not sorted", u)
-		min_u = min (min_u, u)
-		max_u = max (max_u, u)
-		num += 1
-
-		if block:
-			print "\n  /* %s */\n" % block
-			block = ''
-
-		if last != -1:
-			last += 1
-			while last < u:
-				print "  JOINING_TYPE_X, /* %04X */" % last
-				last += 1
-		else:
-			last = u
 
 		if fields[3] in ["ALAPH", "DALATH RISH"]:
 			value = "JOINING_GROUP_" + fields[3].replace(' ', '_')
 		else:
 			value = "JOINING_TYPE_" + fields[2]
-		print "  %s, /* %s */" % (value, '; '.join(fields))
+		values[u] = (value, fields)
 
+	keys = values.keys()
+	min_u = min(keys)
+	max_u = max(keys)
+	num = len(values)
+	print
+	print "static const uint8_t joining_table[] ="
+	print "{"
+	last_block = None
+	for u in range(min_u, max_u+1):
+		value,fields = values.get(u, ("JOINING_TYPE_X", ["%04X"%u]))
+		block = blocks.get(u, last_block)
+		if block != last_block:
+			print "\n  /* %s */\n" % block
+			last_block = block
+
+		print "  %s, /* %s */" % (value, '; '.join(fields))
 	print
 	print "};"
 	print
@@ -174,7 +187,7 @@ print "/* == Start of generated table == */"
 print "/*"
 print " * The following table is generated by running:"
 print " *"
-print " *   ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt"
+print " *   ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt"
 print " *"
 print " * on files with these headers:"
 print " *"
@@ -187,6 +200,7 @@ print "#ifndef HB_OT_SHAPE_COMPLEX_ARABIC_TABLE_HH"
 print "#define HB_OT_SHAPE_COMPLEX_ARABIC_TABLE_HH"
 print
 
+read_blocks (files[2])
 print_joining_table (files[0])
 print_shaping_table (files[1])
 
diff --git a/src/hb-ot-shape-complex-arabic-table.hh b/src/hb-ot-shape-complex-arabic-table.hh
index 730a275..3375266 100644
--- a/src/hb-ot-shape-complex-arabic-table.hh
+++ b/src/hb-ot-shape-complex-arabic-table.hh
@@ -2,12 +2,14 @@
 /*
  * The following table is generated by running:
  *
- *   ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt
+ *   ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
  *
  * on files with these headers:
  *
  * # ArabicShaping-6.2.0.txt
  * # Date: 2012-05-15, 21:05:00 GMT [KW]
+ * # Blocks-6.2.0.txt
+ * # Date: 2012-05-14, 22:42:00 GMT [KW, LI]
  * UnicodeData.txt does not have a header.
  */
 
@@ -18,7 +20,7 @@
 static const uint8_t joining_table[] =
 {
 
-  /* Arabic Characters */
+  /* Arabic */
 
   JOINING_TYPE_U, /* 0600; ARABIC NUMBER SIGN; U; No_Joining_Group */
   JOINING_TYPE_U, /* 0601; ARABIC SIGN SANAH; U; No_Joining_Group */
@@ -277,7 +279,7 @@ static const uint8_t joining_table[] =
   JOINING_TYPE_X, /* 06FE */
   JOINING_TYPE_D, /* 06FF; KNOTTED HEH WITH INVERTED V ABOVE; D; KNOTTED HEH */
 
-  /* Syriac Characters */
+  /* Syriac */
 
   JOINING_TYPE_X, /* 0700 */
   JOINING_TYPE_X, /* 0701 */
@@ -360,7 +362,7 @@ static const uint8_t joining_table[] =
   JOINING_TYPE_D, /* 074E; SOGDIAN KHAPH; D; KHAPH */
   JOINING_TYPE_D, /* 074F; SOGDIAN FE; D; FE */
 
-  /* Arabic Supplement Characters */
+  /* Arabic Supplement */
 
   JOINING_TYPE_D, /* 0750; DOTLESS BEH WITH HORIZONTAL 3 DOTS BELOW; D; BEH */
   JOINING_TYPE_D, /* 0751; BEH WITH 3 DOTS ABOVE; D; BEH */
@@ -411,7 +413,7 @@ static const uint8_t joining_table[] =
   JOINING_TYPE_D, /* 077E; SEEN WITH INVERTED V ABOVE; D; SEEN */
   JOINING_TYPE_D, /* 077F; KAF WITH 2 DOTS ABOVE; D; KAF */
 
-  /* N'Ko Characters */
+  /* Thaana */
 
   JOINING_TYPE_X, /* 0780 */
   JOINING_TYPE_X, /* 0781 */
@@ -477,6 +479,9 @@ static const uint8_t joining_table[] =
   JOINING_TYPE_X, /* 07BD */
   JOINING_TYPE_X, /* 07BE */
   JOINING_TYPE_X, /* 07BF */
+
+  /* NKo */
+
   JOINING_TYPE_X, /* 07C0 */
   JOINING_TYPE_X, /* 07C1 */
   JOINING_TYPE_X, /* 07C2 */
@@ -536,14 +541,14 @@ static const uint8_t joining_table[] =
   JOINING_TYPE_X, /* 07F8 */
   JOINING_TYPE_X, /* 07F9 */
   JOINING_TYPE_C, /* 07FA; NKO LAJANYALAN; C; No_Joining_Group */
-
-  /* Mandaic Characters */
-
   JOINING_TYPE_X, /* 07FB */
   JOINING_TYPE_X, /* 07FC */
   JOINING_TYPE_X, /* 07FD */
   JOINING_TYPE_X, /* 07FE */
   JOINING_TYPE_X, /* 07FF */
+
+  /* Samaritan */
+
   JOINING_TYPE_X, /* 0800 */
   JOINING_TYPE_X, /* 0801 */
   JOINING_TYPE_X, /* 0802 */
@@ -608,6 +613,9 @@ static const uint8_t joining_table[] =
   JOINING_TYPE_X, /* 083D */
   JOINING_TYPE_X, /* 083E */
   JOINING_TYPE_X, /* 083F */
+
+  /* Mandaic */
+
   JOINING_TYPE_R, /* 0840; MANDAIC HALQA; R; No_Joining_Group */
   JOINING_TYPE_D, /* 0841; MANDAIC AB; D; No_Joining_Group */
   JOINING_TYPE_D, /* 0842; MANDAIC AG; D; No_Joining_Group */
@@ -633,9 +641,6 @@ static const uint8_t joining_table[] =
   JOINING_TYPE_U, /* 0856; MANDAIC DUSHENNA; U; No_Joining_Group */
   JOINING_TYPE_U, /* 0857; MANDAIC KAD; U; No_Joining_Group */
   JOINING_TYPE_U, /* 0858; MANDAIC AIN; U; No_Joining_Group */
-
-  /* Arabic Extended-A Characters */
-
   JOINING_TYPE_X, /* 0859 */
   JOINING_TYPE_X, /* 085A */
   JOINING_TYPE_X, /* 085B */
@@ -707,6 +712,9 @@ static const uint8_t joining_table[] =
   JOINING_TYPE_X, /* 089D */
   JOINING_TYPE_X, /* 089E */
   JOINING_TYPE_X, /* 089F */
+
+  /* Arabic Extended-A */
+
   JOINING_TYPE_D, /* 08A0; DOTLESS BEH WITH V BELOW; D; BEH */
   JOINING_TYPE_X, /* 08A1 */
   JOINING_TYPE_D, /* 08A2; HAH WITH DOT BELOW AND 2 DOTS ABOVE; D; HAH */
commit 171f970e4f72d9fe1af30eab32b96906ee4a14f5
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Jun 20 15:25:30 2014 -0400

    [indic-table] Black-list Thai, Lao, and Tibetan
    
    We don't need Indic table for those.

diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py
index e94c3e5..10e4579 100755
--- a/src/gen-indic-table.py
+++ b/src/gen-indic-table.py
@@ -6,6 +6,8 @@ if len (sys.argv) != 4:
 	print >>sys.stderr, "usage: ./gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt"
 	sys.exit (1)
 
+BLACKLISTED_BLOCKS = ["Thai", "Lao", "Tibetan"]
+
 files = [file (x) for x in sys.argv[1:]]
 
 headers = [[f.readline () for i in range (2)] for f in files]
@@ -52,6 +54,7 @@ for i,d in enumerate (data):
 		if not u in combined:
 			combined[u] = list (defaults)
 		combined[u][i] = v
+combined = {k:v for k,v in combined.items() if v[2] not in BLACKLISTED_BLOCKS}
 data = combined
 del combined
 num = len (data)
diff --git a/src/hb-ot-shape-complex-indic-table.cc b/src/hb-ot-shape-complex-indic-table.cc
index 642c4e3..a6d805e 100644
--- a/src/hb-ot-shape-complex-indic-table.cc
+++ b/src/hb-ot-shape-complex-indic-table.cc
@@ -252,65 +252,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0DE0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0DE8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0DF0 */  _(x,x),  _(x,x),  _(M,R),  _(M,R),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0DF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Thai */
-
-  /* 0E00 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0E08 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0E10 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0E18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0E20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0E28 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),
-  /* 0E30 */  _(M,R),  _(M,T),  _(M,R),  _(M,R),  _(M,T),  _(M,T),  _(M,T),  _(M,T),
-  /* 0E38 */  _(M,B),  _(M,B),  _(V,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0E40 */_(M,VOL),_(M,VOL),_(M,VOL),_(M,VOL),_(M,VOL),  _(M,R),  _(x,x),  _(M,T),
-  /* 0E48 */ _(TM,x), _(TM,x), _(TM,x), _(TM,x),  _(x,x), _(Bi,x),  _(V,T),  _(x,x),
-  /* 0E50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0E58 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0E60 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0E68 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0E70 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0E78 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Lao */
-
-  /* 0E80 */  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(x,x),  _(x,x),  _(C,x),
-  /* 0E88 */  _(C,x),  _(x,x),  _(C,x),  _(x,x),  _(x,x),  _(C,x),  _(x,x),  _(x,x),
-  /* 0E90 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0E98 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0EA0 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(x,x),  _(C,x),
-  /* 0EA8 */  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),
-  /* 0EB0 */  _(M,R),  _(M,T),  _(M,R),  _(M,R),  _(M,T),  _(M,T),  _(M,T),  _(M,T),
-  /* 0EB8 */  _(M,B),  _(M,B),  _(x,x),  _(M,T), _(CM,x), _(CM,x),  _(x,x),  _(x,x),
-  /* 0EC0 */_(M,VOL),_(M,VOL),_(M,VOL),_(M,VOL),_(M,VOL),  _(x,x),  _(x,x),  _(x,x),
-  /* 0EC8 */ _(TM,x), _(TM,x), _(TM,x), _(TM,x),  _(x,x), _(Bi,x),  _(x,x),  _(x,x),
-  /* 0ED0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0ED8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x0f40 1504
-
-
-  /* Tibetan */
-
-  /* 0F40 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0F48 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0F50 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0F58 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0F60 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0F68 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0F70 */  _(x,x),  _(M,B),  _(M,T), _(M,TB),  _(M,B),  _(M,B), _(M,TB), _(M,TB),
-  /* 0F78 */ _(M,TB), _(M,TB),  _(M,T),  _(M,T),  _(M,T),  _(M,T), _(Bi,x), _(Vs,x),
-  /* 0F80 */  _(M,T), _(M,TB), _(Bi,x), _(Bi,x),  _(V,B),  _(A,x),  _(x,x),  _(x,x),
-  /* 0F88 */_(CHL,x),_(CHL,x),_(CHL,x),_(CHL,x),_(CHL,x), _(CS,x), _(CS,x), _(CS,x),
-  /* 0F90 */ _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x),
-  /* 0F98 */  _(x,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x),
-  /* 0FA0 */ _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x),
-  /* 0FA8 */ _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x),
-  /* 0FB0 */ _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x),
-  /* 0FB8 */ _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x1000 1632
+
+#define indic_offset_0x1000 1272
 
 
   /* Myanmar */
@@ -336,7 +279,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1090 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1098 */  _(x,x),  _(x,x), _(TM,x), _(TM,x),  _(M,R),  _(M,T),  _(x,x),  _(x,x),
 
-#define indic_offset_0x1700 1792
+#define indic_offset_0x1700 1432
 
 
   /* Tagalog */
@@ -382,7 +325,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 17D0 */  _(x,x),  _(V,T),  _(V,I),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 17D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(A,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x1900 2016
+#define indic_offset_0x1900 1656
 
 
   /* Limbu */
@@ -448,7 +391,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1A70 */  _(M,L),  _(M,L),  _(M,L),  _(M,T),  _(M,T), _(TM,x), _(TM,x), _(TM,x),
   /* 1A78 */ _(TM,x), _(TM,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x1b00 2400
+#define indic_offset_0x1b00 2040
 
 
   /* Balinese */
@@ -505,14 +448,14 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1C40 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1C48 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
 
-#define indic_offset_0x1cf0 2736
+#define indic_offset_0x1cf0 2376
 
 
   /* Vedic Extensions */
 
   /* 1CF0 */  _(x,x),  _(x,x), _(Vs,x), _(Vs,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0xa800 2744
+#define indic_offset_0xa800 2384
 
 
   /* Syloti Nagri */
@@ -549,7 +492,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A8B8 */  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),
   /* A8C0 */  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(V,B),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0xa908 2944
+#define indic_offset_0xa908 2584
 
 
   /* Kayah Li */
@@ -585,7 +528,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A9B8 */  _(M,B),  _(M,B),  _(M,L),  _(M,L),  _(M,T), _(CS,x), _(CM,x), _(CM,x),
   /* A9C0 */ _(V,BR),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0xaa00 3136
+#define indic_offset_0xaa00 2776
 
 
   /* Cham */
@@ -631,7 +574,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* AAE8 */  _(C,x),  _(C,x),  _(C,x),  _(M,L),  _(M,B),  _(M,T),  _(M,L),  _(M,R),
   /* AAF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(Vs,x),  _(V,I),  _(x,x),
 
-#define indic_offset_0xabc0 3384
+#define indic_offset_0xabc0 3024
 
 
   /* Meetei Mayek */
@@ -643,7 +586,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* ABE0 */ _(CF,x), _(CF,x), _(CF,x),  _(M,R),  _(M,R),  _(M,T),  _(M,R),  _(M,R),
   /* ABE8 */  _(M,B),  _(M,R),  _(M,R),  _(x,x), _(TM,x),  _(V,B),  _(x,x),  _(x,x),
 
-#define indic_offset_0x10a00 3432
+#define indic_offset_0x10a00 3072
 
 
   /* Kharoshthi */
@@ -657,7 +600,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 10A30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 10A38 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(V,I),
 
-#define indic_offset_0x11000 3496
+#define indic_offset_0x11000 3136
 
 
   /* Brahmi */
@@ -672,7 +615,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 11038 */  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(M,B),  _(M,B),  _(M,B),  _(M,B),
   /* 11040 */  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(V,T),  _(x,x),
 
-#define indic_offset_0x11080 3568
+#define indic_offset_0x11080 3208
 
 
   /* Kaithi */
@@ -686,7 +629,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 110B0 */  _(M,R),  _(M,L),  _(M,R),  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,R),
   /* 110B8 */  _(M,R),  _(V,B),  _(N,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x11100 3632
+#define indic_offset_0x11100 3272
 
 
   /* Chakma */
@@ -699,7 +642,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 11128 */  _(M,T),  _(M,T),  _(M,B),  _(M,B),  _(M,L),  _(M,T), _(M,TB), _(M,TB),
   /* 11130 */  _(M,T),  _(M,B),  _(M,B),  _(V,I),  _(V,T),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x11180 3688
+#define indic_offset_0x11180 3328
 
 
   /* Sharada */
@@ -714,7 +657,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 111B8 */  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T), _(M,TR),
   /* 111C0 */  _(V,R),  _(A,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x11680 3760
+#define indic_offset_0x11680 3400
 
 
   /* Takri */
@@ -727,7 +670,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 116A8 */  _(C,x),  _(C,x),  _(C,x), _(Bi,x), _(Vs,x),  _(M,T),  _(M,L),  _(M,R),
   /* 116B0 */  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(V,T),  _(N,x),
 
-}; /* Table items: 3816; occupancy: 69% */
+}; /* Table items: 3456; occupancy: 69% */
 
 INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u)
@@ -735,8 +678,7 @@ hb_indic_get_categories (hb_codepoint_t u)
   switch (u >> 12)
   {
     case 0x0:
-      if (0x0900 <= u && u <= 0x0EE0) return indic_table[u - 0x0900 + indic_offset_0x0900];
-      if (0x0F40 <= u && u <= 0x0FC0) return indic_table[u - 0x0F40 + indic_offset_0x0f40];
+      if (0x0900 <= u && u <= 0x0DF8) return indic_table[u - 0x0900 + indic_offset_0x0900];
       if (unlikely (u == 0x00A0)) return _(CP,x);
       break;
 
commit 65ac2dae4f284f563b2dc476a21e2b5a48124de8
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Jun 20 15:12:49 2014 -0400

    [indic-table] Speed up lookup

diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py
index b568d1e..e94c3e5 100755
--- a/src/gen-indic-table.py
+++ b/src/gen-indic-table.py
@@ -194,11 +194,23 @@ print
 print "INDIC_TABLE_ELEMENT_TYPE"
 print "hb_indic_get_categories (hb_codepoint_t u)"
 print "{"
-for (start,end) in zip (starts, ends):
-	offset = "indic_offset_0x%04x" % start
-	print "  if (0x%04X <= u && u <= 0x%04X) return indic_table[u - 0x%04X + %s];" % (start, end, start, offset)
-for u,d in singles.items ():
-	print "  if (unlikely (u == 0x%04X)) return _(%s,%s);" % (u, short[0][d[0]], short[1][d[1]])
+print "  switch (u >> 12)"
+print "  {"
+pages = set([u>>12 for u in starts+ends+singles.keys()])
+for p in pages:
+	print "    case 0x%0X:" % p
+	for (start,end) in zip (starts, ends):
+		if p not in [start>>12, end>>12]: continue
+		offset = "indic_offset_0x%04x" % start
+		print "      if (0x%04X <= u && u <= 0x%04X) return indic_table[u - 0x%04X + %s];" % (start, end, start, offset)
+	for u,d in singles.items ():
+		if p != u>>12: continue
+		print "      if (unlikely (u == 0x%04X)) return _(%s,%s);" % (u, short[0][d[0]], short[1][d[1]])
+	print "      break;"
+	print ""
+print "    default:"
+print "      break;"
+print "  }"
 print "  return _(x,x);"
 print "}"
 print
diff --git a/src/hb-ot-shape-complex-indic-table.cc b/src/hb-ot-shape-complex-indic-table.cc
index e37509f..642c4e3 100644
--- a/src/hb-ot-shape-complex-indic-table.cc
+++ b/src/hb-ot-shape-complex-indic-table.cc
@@ -732,25 +732,48 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u)
 {
-  if (0x0900 <= u && u <= 0x0EE0) return indic_table[u - 0x0900 + indic_offset_0x0900];
-  if (0x0F40 <= u && u <= 0x0FC0) return indic_table[u - 0x0F40 + indic_offset_0x0f40];
-  if (0x1000 <= u && u <= 0x10A0) return indic_table[u - 0x1000 + indic_offset_0x1000];
-  if (0x1700 <= u && u <= 0x17E0) return indic_table[u - 0x1700 + indic_offset_0x1700];
-  if (0x1900 <= u && u <= 0x1A80) return indic_table[u - 0x1900 + indic_offset_0x1900];
-  if (0x1B00 <= u && u <= 0x1C50) return indic_table[u - 0x1B00 + indic_offset_0x1b00];
-  if (0x1CF0 <= u && u <= 0x1CF8) return indic_table[u - 0x1CF0 + indic_offset_0x1cf0];
-  if (0xA800 <= u && u <= 0xA8C8) return indic_table[u - 0xA800 + indic_offset_0xa800];
-  if (0xA908 <= u && u <= 0xA9C8) return indic_table[u - 0xA908 + indic_offset_0xa908];
-  if (0xAA00 <= u && u <= 0xAAF8) return indic_table[u - 0xAA00 + indic_offset_0xaa00];
-  if (0xABC0 <= u && u <= 0xABF0) return indic_table[u - 0xABC0 + indic_offset_0xabc0];
-  if (0x10A00 <= u && u <= 0x10A40) return indic_table[u - 0x10A00 + indic_offset_0x10a00];
-  if (0x11000 <= u && u <= 0x11048) return indic_table[u - 0x11000 + indic_offset_0x11000];
-  if (0x11080 <= u && u <= 0x110C0) return indic_table[u - 0x11080 + indic_offset_0x11080];
-  if (0x11100 <= u && u <= 0x11138) return indic_table[u - 0x11100 + indic_offset_0x11100];
-  if (0x11180 <= u && u <= 0x111C8) return indic_table[u - 0x11180 + indic_offset_0x11180];
-  if (0x11680 <= u && u <= 0x116B8) return indic_table[u - 0x11680 + indic_offset_0x11680];
-  if (unlikely (u == 0x00A0)) return _(CP,x);
-  if (unlikely (u == 0x25CC)) return _(CP,x);
+  switch (u >> 12)
+  {
+    case 0x0:
+      if (0x0900 <= u && u <= 0x0EE0) return indic_table[u - 0x0900 + indic_offset_0x0900];
+      if (0x0F40 <= u && u <= 0x0FC0) return indic_table[u - 0x0F40 + indic_offset_0x0f40];
+      if (unlikely (u == 0x00A0)) return _(CP,x);
+      break;
+
+    case 0x1:
+      if (0x1000 <= u && u <= 0x10A0) return indic_table[u - 0x1000 + indic_offset_0x1000];
+      if (0x1700 <= u && u <= 0x17E0) return indic_table[u - 0x1700 + indic_offset_0x1700];
+      if (0x1900 <= u && u <= 0x1A80) return indic_table[u - 0x1900 + indic_offset_0x1900];
+      if (0x1B00 <= u && u <= 0x1C50) return indic_table[u - 0x1B00 + indic_offset_0x1b00];
+      if (0x1CF0 <= u && u <= 0x1CF8) return indic_table[u - 0x1CF0 + indic_offset_0x1cf0];
+      break;
+
+    case 0x2:
+      if (unlikely (u == 0x25CC)) return _(CP,x);
+      break;
+
+    case 0xA:
+      if (0xA800 <= u && u <= 0xA8C8) return indic_table[u - 0xA800 + indic_offset_0xa800];
+      if (0xA908 <= u && u <= 0xA9C8) return indic_table[u - 0xA908 + indic_offset_0xa908];
+      if (0xAA00 <= u && u <= 0xAAF8) return indic_table[u - 0xAA00 + indic_offset_0xaa00];
+      if (0xABC0 <= u && u <= 0xABF0) return indic_table[u - 0xABC0 + indic_offset_0xabc0];
+      break;
+
+    case 0x10:
+      if (0x10A00 <= u && u <= 0x10A40) return indic_table[u - 0x10A00 + indic_offset_0x10a00];
+      break;
+
+    case 0x11:
+      if (0x11000 <= u && u <= 0x11048) return indic_table[u - 0x11000 + indic_offset_0x11000];
+      if (0x11080 <= u && u <= 0x110C0) return indic_table[u - 0x11080 + indic_offset_0x11080];
+      if (0x11100 <= u && u <= 0x11138) return indic_table[u - 0x11100 + indic_offset_0x11100];
+      if (0x11180 <= u && u <= 0x111C8) return indic_table[u - 0x11180 + indic_offset_0x11180];
+      if (0x11680 <= u && u <= 0x116B8) return indic_table[u - 0x11680 + indic_offset_0x11680];
+      break;
+
+    default:
+      break;
+  }
   return _(x,x);
 }
 
commit 64442a3f4c5c7be08893454742cad6bfe73cb8d7
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Jun 20 14:58:53 2014 -0400

    [indic-table] Fix compiler warning

diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py
index 0310a9c..b568d1e 100755
--- a/src/gen-indic-table.py
+++ b/src/gen-indic-table.py
@@ -188,10 +188,8 @@ ends.append (last + 1)
 offset += ends[-1] - starts[-1]
 print
 print
-print "#define indic_offset_total %d" % offset
-print
 occupancy = used * 100. / total
-print "}; /* Table occupancy: %d%% */" % occupancy
+print "}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy)
 print
 print "INDIC_TABLE_ELEMENT_TYPE"
 print "hb_indic_get_categories (hb_codepoint_t u)"
diff --git a/src/hb-ot-shape-complex-indic-table.cc b/src/hb-ot-shape-complex-indic-table.cc
index ca986dd..e37509f 100644
--- a/src/hb-ot-shape-complex-indic-table.cc
+++ b/src/hb-ot-shape-complex-indic-table.cc
@@ -727,9 +727,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 116A8 */  _(C,x),  _(C,x),  _(C,x), _(Bi,x), _(Vs,x),  _(M,T),  _(M,L),  _(M,R),
   /* 116B0 */  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(V,T),  _(N,x),
 
-#define indic_offset_total 3816
-
-}; /* Table occupancy: 69% */
+}; /* Table items: 3816; occupancy: 69% */
 
 INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u)
commit 0436e1d50527497ebe5053b51a34ce6590276249
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Jun 20 14:56:22 2014 -0400

    [indic-table] Make table more compact by not covering full blocks
    
    -#define indic_offset_total 4416
    +#define indic_offset_total 3816
    
    -}; /* Table occupancy: 60% */
    +}; /* Table occupancy: 69% */

diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py
index 5adbe6a..0310a9c 100755
--- a/src/gen-indic-table.py
+++ b/src/gen-indic-table.py
@@ -124,10 +124,13 @@ print
 
 total = 0
 used = 0
+last_block = None
 def print_block (block, start, end, data):
-	print
-	print
-	print "  /* %s */" % block
+	global total, used, last_block
+	if block and block != last_block:
+		print
+		print
+		print "  /* %s */" % block
 	num = 0
 	assert start % 8 == 0
 	assert (end+1) % 8 == 0
@@ -140,9 +143,10 @@ def print_block (block, start, end, data):
 		d = data.get (u, defaults)
 		sys.stdout.write ("%9s" % ("_(%s,%s)," % (short[0][d[0]], short[1][d[1]])))
 
-	global total, used
 	total += end - start + 1
 	used += num
+	if block:
+		last_block = block
 
 uu = data.keys ()
 uu.sort ()
@@ -157,11 +161,17 @@ for u in uu:
 	if u <= last:
 		continue
 	block = data[u][2]
-	(start, end) = blocks[block]
+	(bstart, bend) = blocks[block]
+
+	start = u//8*8
+	end = start+1
+	while end < bend and end in uu:
+		end += 1
+	end = (end-1)//8*8 + 7
 
 	if start != last + 1:
-		if start - last <= 33:
-			print_block ("FILLER", last+1, start-1, data)
+		if start - last <= 1+16*3:
+			print_block (None, last+1, start-1, data)
 			last = start-1
 		else:
 			if last >= 0:
diff --git a/src/hb-ot-shape-complex-indic-table.cc b/src/hb-ot-shape-complex-indic-table.cc
index fc3a149..ca986dd 100644
--- a/src/hb-ot-shape-complex-indic-table.cc
+++ b/src/hb-ot-shape-complex-indic-table.cc
@@ -287,21 +287,12 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0EC8 */ _(TM,x), _(TM,x), _(TM,x), _(TM,x),  _(x,x), _(Bi,x),  _(x,x),  _(x,x),
   /* 0ED0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0ED8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),
-  /* 0EE0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0EE8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0EF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0EF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+
+#define indic_offset_0x0f40 1504
+
 
   /* Tibetan */
 
-  /* 0F00 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0F08 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0F10 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0F18 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0F20 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0F28 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0F30 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0F38 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0F40 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0F48 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0F50 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -318,14 +309,9 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0FA8 */ _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x),
   /* 0FB0 */ _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x),
   /* 0FB8 */ _(CS,x), _(CS,x), _(CS,x), _(CS,x), _(CS,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0FC0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0FC8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0FD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0FD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0FE0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0FE8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0FF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0FF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+
+#define indic_offset_0x1000 1632
+
 
   /* Myanmar */
 
@@ -350,7 +336,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1090 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1098 */  _(x,x),  _(x,x), _(TM,x), _(TM,x),  _(M,R),  _(M,T),  _(x,x),  _(x,x),
 
-#define indic_offset_0x1700 1952
+#define indic_offset_0x1700 1792
 
 
   /* Tagalog */
@@ -395,12 +381,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 17C8 */  _(M,R), _(RS,x), _(RS,x),  _(x,x), _(CR,x),  _(x,x),  _(x,x),  _(x,x),
   /* 17D0 */  _(x,x),  _(V,T),  _(V,I),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 17D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(A,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 17E0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 17E8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 17F0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 17F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x1900 2208
+#define indic_offset_0x1900 2016
 
 
   /* Limbu */
@@ -439,9 +421,6 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 19C8 */ _(TM,x), _(TM,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 19D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 19D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* FILLER */
-
   /* 19E0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 19E8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 19F0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
@@ -468,14 +447,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1A68 */  _(M,T),  _(M,B),  _(M,B),  _(M,T),  _(M,B),  _(M,R),  _(M,L),  _(M,L),
   /* 1A70 */  _(M,L),  _(M,L),  _(M,L),  _(M,T),  _(M,T), _(TM,x), _(TM,x), _(TM,x),
   /* 1A78 */ _(TM,x), _(TM,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1A80 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1A88 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1A90 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1A98 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1AA0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1AA8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x1b00 2640
+#define indic_offset_0x1b00 2400
 
 
   /* Balinese */
@@ -532,19 +505,14 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1C40 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1C48 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
 
-#define indic_offset_0x1cd0 2976
+#define indic_offset_0x1cf0 2736
 
 
   /* Vedic Extensions */
 
-  /* 1CD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1CD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1CE0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1CE8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1CF0 */  _(x,x),  _(x,x), _(Vs,x), _(Vs,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1CF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0xa800 3024
+#define indic_offset_0xa800 2744
 
 
   /* Syloti Nagri */
@@ -555,9 +523,6 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A818 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* A820 */  _(C,x),  _(C,x),  _(C,x),  _(M,R),  _(M,R),  _(M,B),  _(M,T),  _(M,R),
   /* A828 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* FILLER */
-
   /* A830 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A838 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
@@ -583,20 +548,12 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A8B0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(CF,x),  _(M,R),  _(M,R),  _(M,R),
   /* A8B8 */  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),
   /* A8C0 */  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(V,B),  _(x,x),  _(x,x),  _(x,x),
-  /* A8C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A8D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A8D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* FILLER */
+#define indic_offset_0xa908 2944
 
-  /* A8E0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A8E8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A8F0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A8F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* Kayah Li */
 
-  /* A900 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A908 */  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* A910 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* A918 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -611,9 +568,6 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A948 */  _(M,B),  _(M,B),  _(M,T),  _(M,B),  _(M,B),  _(M,B),  _(M,B), _(CF,x),
   /* A950 */ _(CF,x), _(CF,x), _(CF,x),  _(V,R),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A958 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* FILLER */
-
   /* A960 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A968 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A970 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
@@ -630,16 +584,9 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A9B0 */  _(C,x),  _(C,x),  _(C,x),  _(N,x),  _(M,R),  _(M,R),  _(M,T),  _(M,T),
   /* A9B8 */  _(M,B),  _(M,B),  _(M,L),  _(M,L),  _(M,T), _(CS,x), _(CM,x), _(CM,x),
   /* A9C0 */ _(V,BR),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A9C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A9D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A9D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* FILLER */
+#define indic_offset_0xaa00 3136
 
-  /* A9E0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A9E8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A9F0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A9F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* Cham */
 
@@ -683,9 +630,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* AAE0 */ _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* AAE8 */  _(C,x),  _(C,x),  _(C,x),  _(M,L),  _(M,B),  _(M,T),  _(M,L),  _(M,R),
   /* AAF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(Vs,x),  _(V,I),  _(x,x),
-  /* AAF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0xabc0 3792
+#define indic_offset_0xabc0 3384
 
 
   /* Meetei Mayek */
@@ -696,10 +642,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* ABD8 */  _(C,x),  _(C,x),  _(C,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
   /* ABE0 */ _(CF,x), _(CF,x), _(CF,x),  _(M,R),  _(M,R),  _(M,T),  _(M,R),  _(M,R),
   /* ABE8 */  _(M,B),  _(M,R),  _(M,R),  _(x,x), _(TM,x),  _(V,B),  _(x,x),  _(x,x),
-  /* ABF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* ABF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x10a00 3856
+#define indic_offset_0x10a00 3432
 
 
   /* Kharoshthi */
@@ -712,12 +656,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 10A28 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 10A30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 10A38 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(V,I),
-  /* 10A40 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 10A48 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 10A50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 10A58 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x11000 3952
+#define indic_offset_0x11000 3496
 
 
   /* Brahmi */
@@ -731,13 +671,9 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 11030 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 11038 */  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(M,B),  _(M,B),  _(M,B),  _(M,B),
   /* 11040 */  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(V,T),  _(x,x),
-  /* 11048 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11050 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11058 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11060 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11068 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11070 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11078 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+
+#define indic_offset_0x11080 3568
+
 
   /* Kaithi */
 
@@ -749,10 +685,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 110A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 110B0 */  _(M,R),  _(M,L),  _(M,R),  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,R),
   /* 110B8 */  _(M,R),  _(V,B),  _(N,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 110C0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 110C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x11100 4160
+#define indic_offset_0x11100 3632
 
 
   /* Chakma */
@@ -764,11 +698,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 11120 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,T),
   /* 11128 */  _(M,T),  _(M,T),  _(M,B),  _(M,B),  _(M,L),  _(M,T), _(M,TB), _(M,TB),
   /* 11130 */  _(M,T),  _(M,B),  _(M,B),  _(V,I),  _(V,T),  _(x,x),  _(x,x),  _(x,x),
-  /* 11138 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11140 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11148 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x11180 4240
+#define indic_offset_0x11180 3688
 
 
   /* Sharada */
@@ -782,11 +713,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 111B0 */  _(C,x),  _(C,x),  _(C,x),  _(M,R),  _(M,L),  _(M,R),  _(M,B),  _(M,B),
   /* 111B8 */  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T), _(M,TR),
   /* 111C0 */  _(V,R),  _(A,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 111C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 111D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 111D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x11680 4336
+#define indic_offset_0x11680 3760
 
 
   /* Takri */
@@ -798,29 +726,31 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 116A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 116A8 */  _(C,x),  _(C,x),  _(C,x), _(Bi,x), _(Vs,x),  _(M,T),  _(M,L),  _(M,R),
   /* 116B0 */  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(V,T),  _(N,x),
-  /* 116B8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 116C0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 116C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_total 4416
+#define indic_offset_total 3816
 
-}; /* Table occupancy: 60% */
+}; /* Table occupancy: 69% */
 
 INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u)
 {
-  if (0x0900 <= u && u <= 0x10A0) return indic_table[u - 0x0900 + indic_offset_0x0900];
-  if (0x1700 <= u && u <= 0x1800) return indic_table[u - 0x1700 + indic_offset_0x1700];
-  if (0x1900 <= u && u <= 0x1AB0) return indic_table[u - 0x1900 + indic_offset_0x1900];
+  if (0x0900 <= u && u <= 0x0EE0) return indic_table[u - 0x0900 + indic_offset_0x0900];
+  if (0x0F40 <= u && u <= 0x0FC0) return indic_table[u - 0x0F40 + indic_offset_0x0f40];
+  if (0x1000 <= u && u <= 0x10A0) return indic_table[u - 0x1000 + indic_offset_0x1000];
+  if (0x1700 <= u && u <= 0x17E0) return indic_table[u - 0x1700 + indic_offset_0x1700];
+  if (0x1900 <= u && u <= 0x1A80) return indic_table[u - 0x1900 + indic_offset_0x1900];
   if (0x1B00 <= u && u <= 0x1C50) return indic_table[u - 0x1B00 + indic_offset_0x1b00];
-  if (0x1CD0 <= u && u <= 0x1D00) return indic_table[u - 0x1CD0 + indic_offset_0x1cd0];
-  if (0xA800 <= u && u <= 0xAB00) return indic_table[u - 0xA800 + indic_offset_0xa800];
-  if (0xABC0 <= u && u <= 0xAC00) return indic_table[u - 0xABC0 + indic_offset_0xabc0];
-  if (0x10A00 <= u && u <= 0x10A60) return indic_table[u - 0x10A00 + indic_offset_0x10a00];
-  if (0x11000 <= u && u <= 0x110D0) return indic_table[u - 0x11000 + indic_offset_0x11000];
-  if (0x11100 <= u && u <= 0x11150) return indic_table[u - 0x11100 + indic_offset_0x11100];
-  if (0x11180 <= u && u <= 0x111E0) return indic_table[u - 0x11180 + indic_offset_0x11180];
-  if (0x11680 <= u && u <= 0x116D0) return indic_table[u - 0x11680 + indic_offset_0x11680];
+  if (0x1CF0 <= u && u <= 0x1CF8) return indic_table[u - 0x1CF0 + indic_offset_0x1cf0];
+  if (0xA800 <= u && u <= 0xA8C8) return indic_table[u - 0xA800 + indic_offset_0xa800];
+  if (0xA908 <= u && u <= 0xA9C8) return indic_table[u - 0xA908 + indic_offset_0xa908];
+  if (0xAA00 <= u && u <= 0xAAF8) return indic_table[u - 0xAA00 + indic_offset_0xaa00];
+  if (0xABC0 <= u && u <= 0xABF0) return indic_table[u - 0xABC0 + indic_offset_0xabc0];
+  if (0x10A00 <= u && u <= 0x10A40) return indic_table[u - 0x10A00 + indic_offset_0x10a00];
+  if (0x11000 <= u && u <= 0x11048) return indic_table[u - 0x11000 + indic_offset_0x11000];
+  if (0x11080 <= u && u <= 0x110C0) return indic_table[u - 0x11080 + indic_offset_0x11080];
+  if (0x11100 <= u && u <= 0x11138) return indic_table[u - 0x11100 + indic_offset_0x11100];
+  if (0x11180 <= u && u <= 0x111C8) return indic_table[u - 0x11180 + indic_offset_0x11180];
+  if (0x11680 <= u && u <= 0x116B8) return indic_table[u - 0x11680 + indic_offset_0x11680];
   if (unlikely (u == 0x00A0)) return _(CP,x);
   if (unlikely (u == 0x25CC)) return _(CP,x);
   return _(x,x);
commit 190a251479b3cfc68871ff1daf9a9d1abe3f86e6
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Jun 20 14:41:39 2014 -0400

    [indic-table] Remove block range from data table
    
    No functional change.

diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py
index 9ed3fd6..5adbe6a 100755
--- a/src/gen-indic-table.py
+++ b/src/gen-indic-table.py
@@ -127,8 +127,10 @@ used = 0
 def print_block (block, start, end, data):
 	print
 	print
-	print "  /* %s  (%04X..%04X) */" % (block, start, end)
+	print "  /* %s */" % block
 	num = 0
+	assert start % 8 == 0
+	assert (end+1) % 8 == 0
 	for u in range (start, end+1):
 		if u % 8 == 0:
 			print
diff --git a/src/hb-ot-shape-complex-indic-table.cc b/src/hb-ot-shape-complex-indic-table.cc
index 18a022b..fc3a149 100644
--- a/src/hb-ot-shape-complex-indic-table.cc
+++ b/src/hb-ot-shape-complex-indic-table.cc
@@ -64,7 +64,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0x0900 0
 
 
-  /* Devanagari  (0900..097F) */
+  /* Devanagari */
 
   /* 0900 */ _(Bi,x), _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0908 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
@@ -83,7 +83,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0970 */  _(x,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0978 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
 
-  /* Bengali  (0980..09FF) */
+  /* Bengali */
 
   /* 0980 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0988 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x), _(VI,x),
@@ -102,7 +102,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 09F0 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 09F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Gurmukhi  (0A00..0A7F) */
+  /* Gurmukhi */
 
   /* 0A00 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0A08 */ _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(VI,x),
@@ -121,7 +121,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0A70 */ _(Bi,x),  _(x,x), _(CP,x), _(CP,x),  _(x,x), _(CM,x),  _(x,x),  _(x,x),
   /* 0A78 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Gujarati  (0A80..0AFF) */
+  /* Gujarati */
 
   /* 0A80 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0A88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x),
@@ -140,7 +140,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0AF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0AF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Oriya  (0B00..0B7F) */
+  /* Oriya */
 
   /* 0B00 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x), _(VI,x),
@@ -159,7 +159,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0B70 */  _(x,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0B78 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Tamil  (0B80..0BFF) */
+  /* Tamil */
 
   /* 0B80 */  _(x,x),  _(x,x), _(Bi,x), _(ML,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0B88 */ _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x),
@@ -178,7 +178,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0BF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0BF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Telugu  (0C00..0C7F) */
+  /* Telugu */
 
   /* 0C00 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0C08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),
@@ -197,7 +197,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0C70 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0C78 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Kannada  (0C80..0CFF) */
+  /* Kannada */
 
   /* 0C80 */  _(x,x),  _(x,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0C88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),
@@ -216,7 +216,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0CF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0CF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Malayalam  (0D00..0D7F) */
+  /* Malayalam */
 
   /* 0D00 */  _(x,x),  _(x,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0D08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),
@@ -235,7 +235,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0D70 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0D78 */  _(x,x),  _(x,x), _(CD,x), _(CD,x), _(CD,x), _(CD,x), _(CD,x), _(CD,x),
 
-  /* Sinhala  (0D80..0DFF) */
+  /* Sinhala */
 
   /* 0D80 */  _(x,x),  _(x,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0D88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
@@ -254,7 +254,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0DF0 */  _(x,x),  _(x,x),  _(M,R),  _(M,R),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0DF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Thai  (0E00..0E7F) */
+  /* Thai */
 
   /* 0E00 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0E08 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -273,7 +273,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0E70 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0E78 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Lao  (0E80..0EFF) */
+  /* Lao */
 
   /* 0E80 */  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(x,x),  _(x,x),  _(C,x),
   /* 0E88 */  _(C,x),  _(x,x),  _(C,x),  _(x,x),  _(x,x),  _(C,x),  _(x,x),  _(x,x),
@@ -292,7 +292,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0EF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0EF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Tibetan  (0F00..0FFF) */
+  /* Tibetan */
 
   /* 0F00 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0F08 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
@@ -327,7 +327,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0FF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0FF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Myanmar  (1000..109F) */
+  /* Myanmar */
 
   /* 1000 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1008 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -353,35 +353,35 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0x1700 1952
 
 
-  /* Tagalog  (1700..171F) */
+  /* Tagalog */
 
   /* 1700 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1708 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),
   /* 1710 */  _(C,x),  _(C,x),  _(M,T),  _(M,B),  _(V,B),  _(x,x),  _(x,x),  _(x,x),
   /* 1718 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Hanunoo  (1720..173F) */
+  /* Hanunoo */
 
   /* 1720 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1728 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1730 */  _(C,x),  _(C,x),  _(M,T),  _(M,B),  _(V,B),  _(x,x),  _(x,x),  _(x,x),
   /* 1738 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Buhid  (1740..175F) */
+  /* Buhid */
 
   /* 1740 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1748 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1750 */  _(C,x),  _(C,x),  _(M,T),  _(M,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1758 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Tagbanwa  (1760..177F) */
+  /* Tagbanwa */
 
   /* 1760 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1768 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),
   /* 1770 */  _(C,x),  _(x,x),  _(M,T),  _(M,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1778 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Khmer  (1780..17FF) */
+  /* Khmer */
 
   /* 1780 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1788 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -403,7 +403,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0x1900 2208
 
 
-  /* Limbu  (1900..194F) */
+  /* Limbu */
 
   /* 1900 */ _(CP,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1908 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -416,7 +416,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1940 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1948 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Tai Le  (1950..197F) */
+  /* Tai Le */
 
   /* 1950 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1958 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -425,7 +425,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1970 */ _(TL,x), _(TL,x), _(TL,x), _(TL,x), _(TL,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1978 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* New Tai Lue  (1980..19DF) */
+  /* New Tai Lue */
 
   /* 1980 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1988 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -440,21 +440,21 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 19D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 19D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* FILLER  (19E0..19FF) */
+  /* FILLER */
 
   /* 19E0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 19E8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 19F0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 19F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Buginese  (1A00..1A1F) */
+  /* Buginese */
 
   /* 1A00 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1A08 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1A10 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,T),
   /* 1A18 */  _(M,B),  _(M,L),  _(M,R),  _(M,L),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Tai Tham  (1A20..1AAF) */
+  /* Tai Tham */
 
   /* 1A20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1A28 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -478,7 +478,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0x1b00 2640
 
 
-  /* Balinese  (1B00..1B7F) */
+  /* Balinese */
 
   /* 1B00 */ _(Bi,x), _(Bi,x), _(Bi,x), _(CR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x),
   /* 1B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
@@ -497,7 +497,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1B70 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1B78 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Sundanese  (1B80..1BBF) */
+  /* Sundanese */
 
   /* 1B80 */ _(Bi,x), _(CR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 1B88 */ _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -508,7 +508,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1BB0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1BB8 */  _(x,x),  _(x,x),  _(A,x),  _(C,x),  _(C,x),  _(C,x), _(CF,x), _(CF,x),
 
-  /* Batak  (1BC0..1BFF) */
+  /* Batak */
 
   /* 1BC0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1BC8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -519,7 +519,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1BF0 */ _(CF,x), _(CF,x),  _(V,R),  _(V,R),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1BF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Lepcha  (1C00..1C4F) */
+  /* Lepcha */
 
   /* 1C00 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1C08 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -535,7 +535,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0x1cd0 2976
 
 
-  /* Vedic Extensions  (1CD0..1CFF) */
+  /* Vedic Extensions */
 
   /* 1CD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 1CD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
@@ -547,7 +547,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0xa800 3024
 
 
-  /* Syloti Nagri  (A800..A82F) */
+  /* Syloti Nagri */
 
   /* A800 */ _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),  _(V,T),  _(C,x),
   /* A808 */  _(C,x),  _(C,x),  _(C,x), _(Bi,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -556,12 +556,12 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A820 */  _(C,x),  _(C,x),  _(C,x),  _(M,R),  _(M,R),  _(M,B),  _(M,T),  _(M,R),
   /* A828 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* FILLER  (A830..A83F) */
+  /* FILLER */
 
   /* A830 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A838 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Phags-pa  (A840..A87F) */
+  /* Phags-pa */
 
   /* A840 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* A848 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -572,7 +572,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A870 */  _(C,x), _(CS,x),  _(C,x), _(Bi,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A878 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Saurashtra  (A880..A8DF) */
+  /* Saurashtra */
 
   /* A880 */ _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* A888 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
@@ -587,14 +587,14 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A8D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A8D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* FILLER  (A8E0..A8FF) */
+  /* FILLER */
 
   /* A8E0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A8E8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A8F0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A8F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Kayah Li  (A900..A92F) */
+  /* Kayah Li */
 
   /* A900 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A908 */  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -603,7 +603,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A920 */  _(C,x),  _(C,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),
   /* A928 */ _(Vo,x), _(Vo,x), _(Vo,x), _(TM,x), _(TM,x), _(TM,x),  _(x,x),  _(x,x),
 
-  /* Rejang  (A930..A95F) */
+  /* Rejang */
 
   /* A930 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* A938 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -612,14 +612,14 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A950 */ _(CF,x), _(CF,x), _(CF,x),  _(V,R),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A958 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* FILLER  (A960..A97F) */
+  /* FILLER */
 
   /* A960 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A968 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A970 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A978 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Javanese  (A980..A9DF) */
+  /* Javanese */
 
   /* A980 */ _(Bi,x), _(Bi,x), _(CR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* A988 */ _(VI,x),  _(C,x),  _(C,x),  _(C,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),
@@ -634,14 +634,14 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A9D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A9D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* FILLER  (A9E0..A9FF) */
+  /* FILLER */
 
   /* A9E0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A9E8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A9F0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* A9F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Cham  (AA00..AA5F) */
+  /* Cham */
 
   /* AA00 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),
   /* AA08 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -656,14 +656,14 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* AA50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* AA58 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Myanmar Extended-A  (AA60..AA7F) */
+  /* Myanmar Extended-A */
 
   /* AA60 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* AA68 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* AA70 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* AA78 */  _(x,x),  _(x,x),  _(C,x), _(TM,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Tai Viet  (AA80..AADF) */
+  /* Tai Viet */
 
   /* AA80 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* AA88 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -678,7 +678,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* AAD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* AAD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Meetei Mayek Extensions  (AAE0..AAFF) */
+  /* Meetei Mayek Extensions */
 
   /* AAE0 */ _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* AAE8 */  _(C,x),  _(C,x),  _(C,x),  _(M,L),  _(M,B),  _(M,T),  _(M,L),  _(M,R),
@@ -688,7 +688,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0xabc0 3792
 
 
-  /* Meetei Mayek  (ABC0..ABFF) */
+  /* Meetei Mayek */
 
   /* ABC0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* ABC8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(VI,x), _(VI,x),
@@ -702,7 +702,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0x10a00 3856
 
 
-  /* Kharoshthi  (10A00..10A5F) */
+  /* Kharoshthi */
 
   /* 10A00 */  _(C,x),  _(M,O),  _(M,B),  _(M,B),  _(x,x),  _(M,T),  _(M,O),  _(x,x),
   /* 10A08 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,B),  _(x,x), _(Bi,x), _(Vs,x),
@@ -720,7 +720,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0x11000 3952
 
 
-  /* Brahmi  (11000..1107F) */
+  /* Brahmi */
 
   /* 11000 */ _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 11008 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
@@ -739,7 +739,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 11070 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 11078 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Kaithi  (11080..110CF) */
+  /* Kaithi */
 
   /* 11080 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 11088 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
@@ -755,7 +755,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0x11100 4160
 
 
-  /* Chakma  (11100..1114F) */
+  /* Chakma */
 
   /* 11100 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),
   /* 11108 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -771,7 +771,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0x11180 4240
 
 
-  /* Sharada  (11180..111DF) */
+  /* Sharada */
 
   /* 11180 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 11188 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
@@ -789,7 +789,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 #define indic_offset_0x11680 4336
 
 
-  /* Takri  (11680..116CF) */
+  /* Takri */
 
   /* 11680 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 11688 */ _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),


More information about the HarfBuzz mailing list