Bug 1269343 - Update harfbuzz to release 1.3.0 + additional recent fixes from upstream. r=jrmuizel
authorJonathan Kew <jkew@mozilla.com>
Mon, 22 Aug 2016 08:26:48 +0100
changeset 310554 ad40e1942ad2c5b0f0723ef4bf6114b506dd721d
parent 310553 8dab8cd5e6f9515d9caec5f5a3fbbbec873a522b
child 310555 1a91a95d5db4996d4cdf603b7d26a2635f562243
push id30585
push userryanvm@gmail.com
push dateMon, 22 Aug 2016 13:41:00 +0000
treeherdermozilla-central@194fe275b4e6 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjrmuizel
bugs1269343
milestone51.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1269343 - Update harfbuzz to release 1.3.0 + additional recent fixes from upstream. r=jrmuizel
gfx/harfbuzz/README-mozilla
gfx/harfbuzz/src/gen-indic-table.py
gfx/harfbuzz/src/gen-use-table.py
gfx/harfbuzz/src/hb-buffer-private.hh
gfx/harfbuzz/src/hb-buffer.cc
gfx/harfbuzz/src/hb-cache-private.hh
gfx/harfbuzz/src/hb-common.cc
gfx/harfbuzz/src/hb-common.h
gfx/harfbuzz/src/hb-coretext.cc
gfx/harfbuzz/src/hb-directwrite.cc
gfx/harfbuzz/src/hb-directwrite.h
gfx/harfbuzz/src/hb-face.cc
gfx/harfbuzz/src/hb-font-private.hh
gfx/harfbuzz/src/hb-font.cc
gfx/harfbuzz/src/hb-ft.cc
gfx/harfbuzz/src/hb-gobject-structs.h
gfx/harfbuzz/src/hb-open-type-private.hh
gfx/harfbuzz/src/hb-ot-font.cc
gfx/harfbuzz/src/hb-ot-layout-common-private.hh
gfx/harfbuzz/src/hb-ot-layout-gsub-table.hh
gfx/harfbuzz/src/hb-ot-layout-gsubgpos-private.hh
gfx/harfbuzz/src/hb-ot-layout-private.hh
gfx/harfbuzz/src/hb-ot-layout.cc
gfx/harfbuzz/src/hb-ot-map.cc
gfx/harfbuzz/src/hb-ot-post-table.hh
gfx/harfbuzz/src/hb-ot-shape-complex-arabic-table.hh
gfx/harfbuzz/src/hb-ot-shape-complex-indic-machine.hh
gfx/harfbuzz/src/hb-ot-shape-complex-indic-machine.rl
gfx/harfbuzz/src/hb-ot-shape-complex-indic-private.hh
gfx/harfbuzz/src/hb-ot-shape-complex-indic-table.cc
gfx/harfbuzz/src/hb-ot-shape-complex-indic.cc
gfx/harfbuzz/src/hb-ot-shape-complex-myanmar.cc
gfx/harfbuzz/src/hb-ot-shape-complex-private.hh
gfx/harfbuzz/src/hb-ot-shape-complex-use-machine.hh
gfx/harfbuzz/src/hb-ot-shape-complex-use-machine.rl
gfx/harfbuzz/src/hb-ot-shape-complex-use-private.hh
gfx/harfbuzz/src/hb-ot-shape-complex-use-table.cc
gfx/harfbuzz/src/hb-ot-shape-complex-use.cc
gfx/harfbuzz/src/hb-ot-tag.cc
gfx/harfbuzz/src/hb-private.hh
gfx/harfbuzz/src/hb-set-private.hh
gfx/harfbuzz/src/hb-shape.cc
gfx/harfbuzz/src/hb-ucdn.cc
gfx/harfbuzz/src/hb-unicode-private.hh
gfx/harfbuzz/src/hb-unicode.h
gfx/harfbuzz/src/hb-uniscribe.cc
gfx/harfbuzz/src/hb-version.h
gfx/harfbuzz/src/sample.py
--- a/gfx/harfbuzz/README-mozilla
+++ b/gfx/harfbuzz/README-mozilla
@@ -1,14 +1,15 @@
-gfx/harfbuzz status as of 2016-04-12:
+gfx/harfbuzz status as of 2016-08-21:
 
 This directory contains the harfbuzz source from the 'master' branch of
 https://github.com/behdad/harfbuzz.
 
-Current version: 1.2.6
+Current version: 1.3.0 + recent fixes from trunk,
+up to 547ddb0721365dca985aef5b759d08718f7c5f82.
 
 
 UPDATING:
 
 Note that gfx/harfbuzz/src/hb-version.h is not present in the upstream Git
 repository. It is created at build time by the harfbuzz build system;
 but as we don't use that build system in mozilla, it is necessary to refresh
 this file when updating harfbuzz, and check it into the mozilla tree.
--- a/gfx/harfbuzz/src/gen-indic-table.py
+++ b/gfx/harfbuzz/src/gen-indic-table.py
@@ -1,17 +1,39 @@
 #!/usr/bin/python
 
 import sys
 
 if len (sys.argv) != 4:
-	print >>sys.stderr, "usage: ./gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt"
+	print >>sys.stderr, "usage: ./gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt"
 	sys.exit (1)
 
-BLACKLISTED_BLOCKS = ["Thai", "Lao", "Tibetan"]
+ALLOWED_SINGLES = [0x00A0, 0x25CC]
+ALLOWED_BLOCKS = [
+	'Basic Latin',
+	'Latin-1 Supplement',
+	'Devanagari',
+	'Bengali',
+	'Gurmukhi',
+	'Gujarati',
+	'Oriya',
+	'Tamil',
+	'Telugu',
+	'Kannada',
+	'Malayalam',
+	'Sinhala',
+	'Myanmar',
+	'Khmer',
+	'Vedic Extensions',
+	'General Punctuation',
+	'Superscripts and Subscripts',
+	'Devanagari Extended',
+	'Myanmar Extended-B',
+	'Myanmar Extended-A',
+]
 
 files = [file (x) for x in sys.argv[1:]]
 
 headers = [[f.readline () for i in range (2)] for f in files]
 
 data = [{} for f in files]
 values = [{} for f in files]
 for i, f in enumerate (files):
@@ -45,36 +67,36 @@ for i,v in enumerate (defaults):
 combined = {}
 for i,d in enumerate (data):
 	for u,v in d.items ():
 		if i == 2 and not u in combined:
 			continue
 		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}
+combined = {k:v for k,v in combined.items() if k in ALLOWED_SINGLES or v[2] in ALLOWED_BLOCKS}
 data = combined
 del combined
 num = len (data)
 
 for u in [0x17CD, 0x17CE, 0x17CF, 0x17D0, 0x17D3]:
 	if data[u][0] == 'Other':
 		data[u][0] = "Vowel_Dependent"
 
 # Move the outliers NO-BREAK SPACE and DOTTED CIRCLE out
 singles = {}
-for u in [0x00A0, 0x25CC]:
+for u in ALLOWED_SINGLES:
 	singles[u] = data[u]
 	del data[u]
 
 print "/* == Start of generated table == */"
 print "/*"
 print " * The following table is generated by running:"
 print " *"
-print " *   ./gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt"
+print " *   ./gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt"
 print " *"
 print " * on files with these headers:"
 print " *"
 for h in headers:
 	for l in h:
 		print " * %s" % (l.strip())
 print " */"
 print
--- a/gfx/harfbuzz/src/gen-use-table.py
+++ b/gfx/harfbuzz/src/gen-use-table.py
@@ -139,46 +139,48 @@ for name in property_names:
 	assert value not in property_values
 	assert value not in globals()
 	property_values[name] = value
 globals().update(property_values)
 
 
 def is_BASE(U, UISC, UGC):
 	return (UISC in [Number, Consonant, Consonant_Head_Letter,
-			#SPEC-OUTDATED Consonant_Placeholder,
-			Tone_Letter] or
+			#SPEC-DRAFT Consonant_Placeholder,
+			Tone_Letter,
+			Vowel_Independent #SPEC-DRAFT
+			] or
 		(UGC == Lo and UISC in [Avagraha, Bindu, Consonant_Final, Consonant_Medial,
 					Consonant_Subjoined, Vowel, Vowel_Dependent]))
-def is_BASE_VOWEL(U, UISC, UGC):
-	return UISC == Vowel_Independent
 def is_BASE_IND(U, UISC, UGC):
-	#SPEC-BROKEN return (UISC in [Consonant_Dead, Modifying_Letter] or UGC == Po)
+	#SPEC-DRAFT return (UISC in [Consonant_Dead, Modifying_Letter] or UGC == Po)
 	return (UISC in [Consonant_Dead, Modifying_Letter] or
-		(UGC == Po and not is_BASE_OTHER(U, UISC, UGC))) # for 104E
+		(UGC == Po and not U in [0x104E, 0x2022]) or
+		False # SPEC-DRAFT-OUTDATED! U == 0x002D
+		)
 def is_BASE_NUM(U, UISC, UGC):
 	return UISC == Brahmi_Joining_Number
 def is_BASE_OTHER(U, UISC, UGC):
-	if UISC == Consonant_Placeholder: return True #SPEC-OUTDATED
-	return U in [0x00A0, 0x00D7, 0x2015, 0x2022, 0x25CC,
-		     0x25FB, 0x25FC, 0x25FD, 0x25FE]
+	if UISC == Consonant_Placeholder: return True #SPEC-DRAFT
+	#SPEC-DRAFT return U in [0x00A0, 0x00D7, 0x2015, 0x2022, 0x25CC, 0x25FB, 0x25FC, 0x25FD, 0x25FE]
+	return U in [0x2015, 0x2022, 0x25FB, 0x25FC, 0x25FD, 0x25FE]
 def is_CGJ(U, UISC, UGC):
 	return U == 0x034F
 def is_CONS_FINAL(U, UISC, UGC):
 	return ((UISC == Consonant_Final and UGC != Lo) or
 		UISC == Consonant_Succeeding_Repha)
 def is_CONS_FINAL_MOD(U, UISC, UGC):
-	#SPEC-OUTDATED return  UISC in [Consonant_Final_Modifier, Syllable_Modifier]
+	#SPEC-DRAFT return  UISC in [Consonant_Final_Modifier, Syllable_Modifier]
 	return  UISC == Syllable_Modifier
 def is_CONS_MED(U, UISC, UGC):
 	return UISC == Consonant_Medial and UGC != Lo
 def is_CONS_MOD(U, UISC, UGC):
 	return UISC in [Nukta, Gemination_Mark, Consonant_Killer]
 def is_CONS_SUB(U, UISC, UGC):
-	#SPEC-OUTDATED return UISC == Consonant_Subjoined
+	#SPEC-DRAFT return UISC == Consonant_Subjoined
 	return UISC == Consonant_Subjoined and UGC != Lo
 def is_HALANT(U, UISC, UGC):
 	return UISC in [Virama, Invisible_Stacker]
 def is_HALANT_NUM(U, UISC, UGC):
 	return UISC == Number_Joiner
 def is_ZWNJ(U, UISC, UGC):
 	return UISC == Non_Joiner
 def is_ZWJ(U, UISC, UGC):
@@ -195,33 +197,32 @@ def is_OTHER(U, UISC, UGC):
 	)
 def is_Reserved(U, UISC, UGC):
 	return UGC == 'Cn'
 def is_REPHA(U, UISC, UGC):
 	#return UISC == Consonant_Preceding_Repha
 	#SPEC-OUTDATED hack to categorize Consonant_With_Stacker and Consonant_Prefixed
 	return UISC in [Consonant_Preceding_Repha, Consonant_With_Stacker, Consonant_Prefixed]
 def is_SYM(U, UISC, UGC):
-	if U == 0x25CC: return False #SPEC-OUTDATED
-	#SPEC-OUTDATED return UGC in [So, Sc] or UISC == Symbol_Letter
+	if U == 0x25CC: return False #SPEC-DRAFT
+	#SPEC-DRAFT return UGC in [So, Sc] or UISC == Symbol_Letter
 	return UGC in [So, Sc]
 def is_SYM_MOD(U, UISC, UGC):
 	return U in [0x1B6B, 0x1B6C, 0x1B6D, 0x1B6E, 0x1B6F, 0x1B70, 0x1B71, 0x1B72, 0x1B73]
 def is_VARIATION_SELECTOR(U, UISC, UGC):
 	return 0xFE00 <= U <= 0xFE0F
 def is_VOWEL(U, UISC, UGC):
 	return (UISC == Pure_Killer or
 		(UGC != Lo and UISC in [Vowel, Vowel_Dependent]))
 def is_VOWEL_MOD(U, UISC, UGC):
 	return (UISC in [Tone_Mark, Cantillation_Mark, Register_Shifter, Visarga] or
 		(UGC != Lo and UISC == Bindu))
 
 use_mapping = {
 	'B':	is_BASE,
-	'IV':	is_BASE_VOWEL,
 	'IND':	is_BASE_IND,
 	'N':	is_BASE_NUM,
 	'GB':	is_BASE_OTHER,
 	'CGJ':	is_CGJ,
 	'F':	is_CONS_FINAL,
 	'FM':	is_CONS_FINAL_MOD,
 	'M':	is_CONS_MED,
 	'CM':	is_CONS_MOD,
--- a/gfx/harfbuzz/src/hb-buffer-private.hh
+++ b/gfx/harfbuzz/src/hb-buffer-private.hh
@@ -129,37 +129,37 @@ struct hb_buffer_t {
 #ifndef HB_NDEBUG
   uint8_t allocated_var_bits;
 #endif
   inline void allocate_var (unsigned int start, unsigned int count)
   {
 #ifndef HB_NDEBUG
     unsigned int end = start + count;
     assert (end <= 8);
-    unsigned int bits = (1<<end) - (1<<start);
+    unsigned int bits = (1u<<end) - (1u<<start);
     assert (0 == (allocated_var_bits & bits));
     allocated_var_bits |= bits;
 #endif
   }
   inline void deallocate_var (unsigned int start, unsigned int count)
   {
 #ifndef HB_NDEBUG
     unsigned int end = start + count;
     assert (end <= 8);
-    unsigned int bits = (1<<end) - (1<<start);
+    unsigned int bits = (1u<<end) - (1u<<start);
     assert (bits == (allocated_var_bits & bits));
     allocated_var_bits &= ~bits;
 #endif
   }
   inline void assert_var (unsigned int start, unsigned int count)
   {
 #ifndef HB_NDEBUG
     unsigned int end = start + count;
     assert (end <= 8);
-    unsigned int bits = (1<<end) - (1<<start);
+    unsigned int bits = (1u<<end) - (1u<<start);
     assert (bits == (allocated_var_bits & bits));
 #endif
   }
   inline void deallocate_var_all (void)
   {
 #ifndef HB_NDEBUG
     allocated_var_bits = 0;
 #endif
--- a/gfx/harfbuzz/src/hb-buffer.cc
+++ b/gfx/harfbuzz/src/hb-buffer.cc
@@ -47,17 +47,17 @@
 
 /**
  * hb_segment_properties_equal:
  * @a: first #hb_segment_properties_t to compare.
  * @b: second #hb_segment_properties_t to compare.
  *
  * Checks the equality of two #hb_segment_properties_t's.
  *
- * Return value: (transfer full):
+ * Return value:
  * %true if all properties of @a equal those of @b, false otherwise.
  *
  * Since: 0.9.7
  **/
 hb_bool_t
 hb_segment_properties_equal (const hb_segment_properties_t *a,
 			     const hb_segment_properties_t *b)
 {
@@ -178,16 +178,22 @@ hb_buffer_t::make_room_for (unsigned int
 
 bool
 hb_buffer_t::shift_forward (unsigned int count)
 {
   assert (have_output);
   if (unlikely (!ensure (len + count))) return false;
 
   memmove (info + idx + count, info + idx, (len - idx) * sizeof (info[0]));
+  if (idx + count > len)
+  {
+    /* Under memory failure we might expose this area.  At least
+     * clean it up.  Oh well... */
+    memset (info + len, 0, (idx + count - len) * sizeof (info[0]));
+  }
   len += count;
   idx += count;
 
   return true;
 }
 
 hb_buffer_t::scratch_buffer_t *
 hb_buffer_t::get_scratch_buffer (unsigned int *size)
@@ -421,16 +427,18 @@ hb_buffer_t::move_to (unsigned int i)
     idx += count;
     out_len += count;
   }
   else if (out_len > i)
   {
     /* Tricky part: rewinding... */
     unsigned int count = out_len - i;
 
+    /* This will blow in our face if memory allocation fails later
+     * in this same lookup... */
     if (unlikely (idx < count && !shift_forward (count + 32))) return false;
 
     assert (idx >= count);
 
     idx -= count;
     out_len -= count;
     memmove (info + idx, out_info + out_len, count * sizeof (out_info[0]));
   }
--- a/gfx/harfbuzz/src/hb-cache-private.hh
+++ b/gfx/harfbuzz/src/hb-cache-private.hh
@@ -40,35 +40,35 @@ struct hb_cache_t
 
   inline void clear (void)
   {
     memset (values, 255, sizeof (values));
   }
 
   inline bool get (unsigned int key, unsigned int *value)
   {
-    unsigned int k = key & ((1<<cache_bits)-1);
+    unsigned int k = key & ((1u<<cache_bits)-1);
     unsigned int v = values[k];
     if ((v >> value_bits) != (key >> cache_bits))
       return false;
-    *value = v & ((1<<value_bits)-1);
+    *value = v & ((1u<<value_bits)-1);
     return true;
   }
 
   inline bool set (unsigned int key, unsigned int value)
   {
     if (unlikely ((key >> key_bits) || (value >> value_bits)))
       return false; /* Overflows */
-    unsigned int k = key & ((1<<cache_bits)-1);
+    unsigned int k = key & ((1u<<cache_bits)-1);
     unsigned int v = ((key>>cache_bits)<<value_bits) | value;
     values[k] = v;
     return true;
   }
 
   private:
-  unsigned int values[1<<cache_bits];
+  unsigned int values[1u<<cache_bits];
 };
 
 typedef hb_cache_t<21, 16, 8> hb_cmap_cache_t;
 typedef hb_cache_t<16, 24, 8> hb_advance_cache_t;
 
 
 #endif /* HB_CACHE_PRIVATE_HH */
--- a/gfx/harfbuzz/src/hb-common.cc
+++ b/gfx/harfbuzz/src/hb-common.cc
@@ -83,17 +83,17 @@ hb_tag_from_string (const char *str, int
     tag[i] = ' ';
 
   return HB_TAG_CHAR4 (tag);
 }
 
 /**
  * hb_tag_to_string:
  * @tag: 
- * @buf: (array fixed-size=4): 
+ * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t): 
  *
  * 
  *
  * Since: 0.9.5
  **/
 void
 hb_tag_to_string (hb_tag_t tag, char *buf)
 {
@@ -502,16 +502,19 @@ hb_script_get_horizontal_direction (hb_s
     case HB_SCRIPT_NABATAEAN:
     case HB_SCRIPT_OLD_NORTH_ARABIAN:
     case HB_SCRIPT_PALMYRENE:
     case HB_SCRIPT_PSALTER_PAHLAVI:
 
     /* Unicode-8.0 additions */
     case HB_SCRIPT_OLD_HUNGARIAN:
 
+    /* Unicode-9.0 additions */
+    case HB_SCRIPT_ADLAM:
+
       return HB_DIRECTION_RTL;
   }
 
   return HB_DIRECTION_LTR;
 }
 
 
 /* hb_user_data_array_t */
--- a/gfx/harfbuzz/src/hb-common.h
+++ b/gfx/harfbuzz/src/hb-common.h
@@ -299,22 +299,32 @@ typedef enum
   /*7.0*/ HB_SCRIPT_PAHAWH_HMONG		= HB_TAG ('H','m','n','g'),
   /*7.0*/ HB_SCRIPT_PALMYRENE			= HB_TAG ('P','a','l','m'),
   /*7.0*/ HB_SCRIPT_PAU_CIN_HAU			= HB_TAG ('P','a','u','c'),
   /*7.0*/ HB_SCRIPT_PSALTER_PAHLAVI		= HB_TAG ('P','h','l','p'),
   /*7.0*/ HB_SCRIPT_SIDDHAM			= HB_TAG ('S','i','d','d'),
   /*7.0*/ HB_SCRIPT_TIRHUTA			= HB_TAG ('T','i','r','h'),
   /*7.0*/ HB_SCRIPT_WARANG_CITI			= HB_TAG ('W','a','r','a'),
 
-  /*8.0*/ HB_SCRIPT_AHOM                        = HB_TAG ('A','h','o','m'),
-  /*8.0*/ HB_SCRIPT_ANATOLIAN_HIEROGLYPHS       = HB_TAG ('H','l','u','w'),
-  /*8.0*/ HB_SCRIPT_HATRAN                      = HB_TAG ('H','a','t','r'),
-  /*8.0*/ HB_SCRIPT_MULTANI                     = HB_TAG ('M','u','l','t'),
-  /*8.0*/ HB_SCRIPT_OLD_HUNGARIAN               = HB_TAG ('H','u','n','g'),
-  /*8.0*/ HB_SCRIPT_SIGNWRITING                 = HB_TAG ('S','g','n','w'),
+  /*8.0*/ HB_SCRIPT_AHOM			= HB_TAG ('A','h','o','m'),
+  /*8.0*/ HB_SCRIPT_ANATOLIAN_HIEROGLYPHS	= HB_TAG ('H','l','u','w'),
+  /*8.0*/ HB_SCRIPT_HATRAN			= HB_TAG ('H','a','t','r'),
+  /*8.0*/ HB_SCRIPT_MULTANI			= HB_TAG ('M','u','l','t'),
+  /*8.0*/ HB_SCRIPT_OLD_HUNGARIAN		= HB_TAG ('H','u','n','g'),
+  /*8.0*/ HB_SCRIPT_SIGNWRITING			= HB_TAG ('S','g','n','w'),
+
+  /*
+   * Since 1.3.0
+   */
+  /*9.0*/ HB_SCRIPT_ADLAM			= HB_TAG ('A','d','l','m'),
+  /*9.0*/ HB_SCRIPT_BHAIKSUKI			= HB_TAG ('B','h','k','s'),
+  /*9.0*/ HB_SCRIPT_MARCHEN			= HB_TAG ('M','a','r','c'),
+  /*9.0*/ HB_SCRIPT_OSAGE			= HB_TAG ('O','s','g','e'),
+  /*9.0*/ HB_SCRIPT_TANGUT			= HB_TAG ('T','a','n','g'),
+  /*9.0*/ HB_SCRIPT_NEWA			= HB_TAG ('N','e','w','a'),
 
   /* No script set. */
   HB_SCRIPT_INVALID				= HB_TAG_NONE,
 
   /* Dummy values to ensure any hb_tag_t value can be passed/stored as hb_script_t
    * without risking undefined behavior.  Include both a signed and unsigned max,
    * since technically enums are int, and indeed, hb_script_t ends up being signed.
    * See this thread for technicalities:
--- a/gfx/harfbuzz/src/hb-coretext.cc
+++ b/gfx/harfbuzz/src/hb-coretext.cc
@@ -141,32 +141,62 @@ static CTFontRef
 create_ct_font (CGFontRef cg_font, CGFloat font_size)
 {
   CTFontRef ct_font = CTFontCreateWithGraphicsFont (cg_font, font_size, NULL, NULL);
   if (unlikely (!ct_font)) {
     DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed");
     return NULL;
   }
 
+  /* crbug.com/576941 and crbug.com/625902 and the investigation in the latter
+   * bug indicate that the cascade list reconfiguration occasionally causes
+   * crashes in CoreText on OS X 10.9, thus let's skip this step on older
+   * operating system versions. */
+  if (&CTGetCoreTextVersion != NULL && CTGetCoreTextVersion() <= kCTVersionNumber10_9)
+    return ct_font;
+
+  CFURLRef original_url = (CFURLRef)CTFontCopyAttribute(ct_font, kCTFontURLAttribute);
+
   /* Create font copy with cascade list that has LastResort first; this speeds up CoreText
    * font fallback which we don't need anyway. */
   {
     CTFontDescriptorRef last_resort_font_desc = get_last_resort_font_desc ();
     CTFontRef new_ct_font = CTFontCreateCopyWithAttributes (ct_font, 0.0, NULL, last_resort_font_desc);
     CFRelease (last_resort_font_desc);
     if (new_ct_font)
     {
-      CFRelease (ct_font);
-      ct_font = new_ct_font;
+      /* The CTFontCreateCopyWithAttributes call fails to stay on the same font
+       * when reconfiguring the cascade list and may switch to a different font
+       * when there are fonts that go by the same name, since the descriptor is
+       * just name and size.
+       *
+       * Avoid reconfiguring the cascade lists if the new font is outside the
+       * system locations that we cannot access from the sandboxed renderer
+       * process in Blink. This can be detected by the new file URL location
+       * that the newly found font points to. */
+      CFURLRef new_url = (CFURLRef) CTFontCopyAttribute (new_ct_font, kCTFontURLAttribute);
+      // Keep reconfigured font if URL cannot be retrieved (seems to be the case
+      // on Mac OS 10.12 Sierra), speculative fix for crbug.com/625606
+      if (!original_url || !new_url || CFEqual (original_url, new_url)) {
+        CFRelease (ct_font);
+        ct_font = new_ct_font;
+      } else {
+        CFRelease (new_ct_font);
+        DEBUG_MSG (CORETEXT, ct_font, "Discarding reconfigured CTFont, location changed.");
+      }
+      if (new_url)
+        CFRelease (new_url);
     }
     else
       DEBUG_MSG (CORETEXT, ct_font, "Font copy with empty cascade list failed");
   }
 
- return ct_font;
+  if (original_url)
+    CFRelease (original_url);
+  return ct_font;
 }
 
 struct hb_coretext_shaper_face_data_t {
   CGFontRef cg_font;
   CTFontRef ct_font;
 };
 
 hb_coretext_shaper_face_data_t *
@@ -690,17 +720,17 @@ hb_bool_t
   for (unsigned int i = 0; i < buffer->len; i++) {
     hb_codepoint_t c = buffer->info[i].codepoint;
     if (likely (c <= 0xFFFFu))
       pchars[chars_len++] = c;
     else if (unlikely (c > 0x10FFFFu))
       pchars[chars_len++] = 0xFFFDu;
     else {
       pchars[chars_len++] = 0xD800u + ((c - 0x10000u) >> 10);
-      pchars[chars_len++] = 0xDC00u + ((c - 0x10000u) & ((1 << 10) - 1));
+      pchars[chars_len++] = 0xDC00u + ((c - 0x10000u) & ((1u << 10) - 1));
     }
   }
 
   ALLOCATE_ARRAY (unsigned int, log_clusters, chars_len, /*nothing*/);
   chars_len = 0;
   for (unsigned int i = 0; i < buffer->len; i++)
   {
     hb_codepoint_t c = buffer->info[i].codepoint;
--- a/gfx/harfbuzz/src/hb-directwrite.cc
+++ b/gfx/harfbuzz/src/hb-directwrite.cc
@@ -20,298 +20,244 @@
  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
 #define HB_SHAPER directwrite
 #include "hb-shaper-impl-private.hh"
 
-#ifndef HB_DIRECTWRITE_EXPERIMENTAL_JUSTIFICATION
-  #include <DWrite.h>
-#else
-  #include <DWrite_1.h>
-#endif
+#include <DWrite_1.h>
 
 #include "hb-directwrite.h"
 
 #include "hb-open-file-private.hh"
 #include "hb-ot-name-table.hh"
 #include "hb-ot-tag.h"
 
 
 #ifndef HB_DEBUG_DIRECTWRITE
 #define HB_DEBUG_DIRECTWRITE (HB_DEBUG+0)
 #endif
 
 HB_SHAPER_DATA_ENSURE_DECLARE(directwrite, face)
 HB_SHAPER_DATA_ENSURE_DECLARE(directwrite, font)
 
+
+/*
+ * DirectWrite font stream helpers
+ */
+
+// This is a font loader which provides only one font (unlike its original design).
+// For a better implementation which was also source of this
+// and DWriteFontFileStream, have a look at to NativeFontResourceDWrite.cpp in Mozilla
+class DWriteFontFileLoader : public IDWriteFontFileLoader
+{
+private:
+  IDWriteFontFileStream *mFontFileStream;
+public:
+  DWriteFontFileLoader (IDWriteFontFileStream *fontFileStream) {
+    mFontFileStream = fontFileStream;
+  }
+
+  // IUnknown interface
+  IFACEMETHOD(QueryInterface)(IID const& iid, OUT void** ppObject) { return S_OK; }
+  IFACEMETHOD_(ULONG, AddRef)() { return 1; }
+  IFACEMETHOD_(ULONG, Release)() { return 1; }
+
+  // IDWriteFontFileLoader methods
+  virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const* fontFileReferenceKey,
+    UINT32 fontFileReferenceKeySize,
+    OUT IDWriteFontFileStream** fontFileStream)
+  {
+    *fontFileStream = mFontFileStream;
+    return S_OK;
+  }
+};
+
+class DWriteFontFileStream : public IDWriteFontFileStream
+{
+private:
+  uint8_t *mData;
+  uint32_t mSize;
+public:
+  DWriteFontFileStream(uint8_t *aData, uint32_t aSize)
+  {
+    mData = aData;
+    mSize = aSize;
+  }
+
+  // IUnknown interface
+  IFACEMETHOD(QueryInterface)(IID const& iid, OUT void** ppObject) { return S_OK; }
+  IFACEMETHOD_(ULONG, AddRef)() { return 1; }
+  IFACEMETHOD_(ULONG, Release)() { return 1; }
+
+  // IDWriteFontFileStream methods
+  virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(void const** fragmentStart,
+    UINT64 fileOffset,
+    UINT64 fragmentSize,
+    OUT void** fragmentContext)
+  {
+    // We are required to do bounds checking.
+    if (fileOffset + fragmentSize > mSize) {
+      return E_FAIL;
+    }
+
+    // truncate the 64 bit fileOffset to size_t sized index into mData
+    size_t index = static_cast<size_t> (fileOffset);
+
+    // We should be alive for the duration of this.
+    *fragmentStart = &mData[index];
+    *fragmentContext = nullptr;
+    return S_OK;
+  }
+
+  virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext) { }
+
+  virtual HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize)
+  {
+    *fileSize = mSize;
+    return S_OK;
+  }
+
+  virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64* lastWriteTime)
+  {
+    return E_NOTIMPL;
+  }
+};
+
+
 /*
 * shaper face data
 */
 
 struct hb_directwrite_shaper_face_data_t {
-  HANDLE fh;
-  wchar_t face_name[LF_FACESIZE];
+  IDWriteFactory *dwriteFactory;
+  IDWriteFontFile *fontFile;
+  IDWriteFontFileStream *fontFileStream;
+  IDWriteFontFileLoader *fontFileLoader;
+  IDWriteFontFace *fontFace;
+  hb_blob_t *faceBlob;
 };
 
-/* face_name should point to a wchar_t[LF_FACESIZE] object. */
-static void
-_hb_generate_unique_face_name(wchar_t *face_name, unsigned int *plen)
-{
-  /* We'll create a private name for the font from a UUID using a simple,
-  * somewhat base64-like encoding scheme */
-  const char *enc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-";
-  UUID id;
-  UuidCreate ((UUID*)&id);
-  ASSERT_STATIC (2 + 3 * (16 / 2) < LF_FACESIZE);
-  unsigned int name_str_len = 0;
-  face_name[name_str_len++] = 'F';
-  face_name[name_str_len++] = '_';
-  unsigned char *p = (unsigned char *)&id;
-  for (unsigned int i = 0; i < 16; i += 2)
-  {
-    /* Spread the 16 bits from two bytes of the UUID across three chars of face_name,
-    * using the bits in groups of 5,5,6 to select chars from enc.
-    * This will generate 24 characters; with the 'F_' prefix we already provided,
-    * the name will be 26 chars (plus the NUL terminator), so will always fit within
-    * face_name (LF_FACESIZE = 32). */
-    face_name[name_str_len++] = enc[p[i] >> 3];
-    face_name[name_str_len++] = enc[((p[i] << 2) | (p[i + 1] >> 6)) & 0x1f];
-    face_name[name_str_len++] = enc[p[i + 1] & 0x3f];
-  }
-  face_name[name_str_len] = 0;
-  if (plen)
-    *plen = name_str_len;
-}
-
-/* Destroys blob. */
-static hb_blob_t *
-_hb_rename_font(hb_blob_t *blob, wchar_t *new_name)
-{
-  /* Create a copy of the font data, with the 'name' table replaced by a
-   * table that names the font with our private F_* name created above.
-   * For simplicity, we just append a new 'name' table and update the
-   * sfnt directory; the original table is left in place, but unused.
-   *
-   * The new table will contain just 5 name IDs: family, style, unique,
-   * full, PS. All of them point to the same name data with our unique name.
-   */
-
-  blob = OT::Sanitizer<OT::OpenTypeFontFile>::sanitize (blob);
-
-  unsigned int length, new_length, name_str_len;
-  const char *orig_sfnt_data = hb_blob_get_data (blob, &length);
-
-  _hb_generate_unique_face_name (new_name, &name_str_len);
-
-  static const uint16_t name_IDs[] = { 1, 2, 3, 4, 6 };
-
-  unsigned int name_table_length = OT::name::min_size +
-    ARRAY_LENGTH(name_IDs) * OT::NameRecord::static_size +
-    name_str_len * 2; /* for name data in UTF16BE form */
-  unsigned int name_table_offset = (length + 3) & ~3;
-
-  new_length = name_table_offset + ((name_table_length + 3) & ~3);
-  void *new_sfnt_data = calloc(1, new_length);
-  if (!new_sfnt_data)
-  {
-    hb_blob_destroy (blob);
-    return NULL;
-  }
-
-  memcpy(new_sfnt_data, orig_sfnt_data, length);
-
-  OT::name &name = OT::StructAtOffset<OT::name> (new_sfnt_data, name_table_offset);
-  name.format.set (0);
-  name.count.set (ARRAY_LENGTH (name_IDs));
-  name.stringOffset.set (name.get_size());
-  for (unsigned int i = 0; i < ARRAY_LENGTH (name_IDs); i++)
-  {
-    OT::NameRecord &record = name.nameRecord[i];
-    record.platformID.set(3);
-    record.encodingID.set(1);
-    record.languageID.set(0x0409u); /* English */
-    record.nameID.set(name_IDs[i]);
-    record.length.set(name_str_len * 2);
-    record.offset.set(0);
-  }
-
-  /* Copy string data from new_name, converting wchar_t to UTF16BE. */
-  unsigned char *p = &OT::StructAfter<unsigned char>(name);
-  for (unsigned int i = 0; i < name_str_len; i++)
-  {
-    *p++ = new_name[i] >> 8;
-    *p++ = new_name[i] & 0xff;
-  }
-
-  /* Adjust name table entry to point to new name table */
-  const OT::OpenTypeFontFile &file = *(OT::OpenTypeFontFile *) (new_sfnt_data);
-  unsigned int face_count = file.get_face_count ();
-  for (unsigned int face_index = 0; face_index < face_count; face_index++)
-  {
-    /* Note: doing multiple edits (ie. TTC) can be unsafe.  There may be
-    * toe-stepping.  But we don't really care. */
-    const OT::OpenTypeFontFace &face = file.get_face (face_index);
-    unsigned int index;
-    if (face.find_table_index (HB_OT_TAG_name, &index))
-    {
-      OT::TableRecord &record = const_cast<OT::TableRecord &> (face.get_table (index));
-      record.checkSum.set_for_data (&name, name_table_length);
-      record.offset.set (name_table_offset);
-      record.length.set (name_table_length);
-    }
-    else if (face_index == 0) /* Fail if first face doesn't have 'name' table. */
-    {
-      free (new_sfnt_data);
-      hb_blob_destroy (blob);
-      return NULL;
-    }
-  }
-
-  /* The checkSumAdjustment field in the 'head' table is now wrong,
-  * but that doesn't actually seem to cause any problems so we don't
-  * bother. */
-
-  hb_blob_destroy (blob);
-  return hb_blob_create ((const char *)new_sfnt_data, new_length,
-    HB_MEMORY_MODE_WRITABLE, NULL, free);
-}
-
 hb_directwrite_shaper_face_data_t *
 _hb_directwrite_shaper_face_data_create(hb_face_t *face)
 {
   hb_directwrite_shaper_face_data_t *data =
-    (hb_directwrite_shaper_face_data_t *) calloc (1, sizeof (hb_directwrite_shaper_face_data_t));
+    (hb_directwrite_shaper_face_data_t *) malloc (sizeof (hb_directwrite_shaper_face_data_t));
   if (unlikely (!data))
     return NULL;
 
+  // TODO: factory and fontFileLoader should be cached separately
+  IDWriteFactory* dwriteFactory;
+  DWriteCreateFactory (
+    DWRITE_FACTORY_TYPE_SHARED,
+    __uuidof (IDWriteFactory),
+    (IUnknown**) &dwriteFactory
+  );
+
+  HRESULT hr;
   hb_blob_t *blob = hb_face_reference_blob (face);
-  if (unlikely (!hb_blob_get_length (blob)))
-    DEBUG_MSG(DIRECTWRITE, face, "Face has empty blob");
+  IDWriteFontFileStream *fontFileStream = new DWriteFontFileStream (
+    (uint8_t*) hb_blob_get_data (blob, NULL), hb_blob_get_length (blob));
 
-  blob = _hb_rename_font (blob, data->face_name);
-  if (unlikely (!blob))
-  {
-    free(data);
-    return NULL;
+  IDWriteFontFileLoader *fontFileLoader = new DWriteFontFileLoader (fontFileStream);
+  dwriteFactory->RegisterFontFileLoader (fontFileLoader);
+
+  IDWriteFontFile *fontFile;
+  uint64_t fontFileKey = 0;
+  hr = dwriteFactory->CreateCustomFontFileReference (&fontFileKey, sizeof (fontFileKey),
+      fontFileLoader, &fontFile);
+
+#define FAIL(...) \
+  HB_STMT_START { \
+    DEBUG_MSG (DIRECTWRITE, NULL, __VA_ARGS__); \
+    return false; \
+  } HB_STMT_END;
+
+  if (FAILED (hr)) {
+    FAIL ("Failed to load font file from data!");
+    return false;
   }
 
-  DWORD num_fonts_installed;
-  data->fh = AddFontMemResourceEx ((void *)hb_blob_get_data(blob, NULL),
-    hb_blob_get_length (blob),
-    0, &num_fonts_installed);
-  if (unlikely (!data->fh))
-  {
-    DEBUG_MSG (DIRECTWRITE, face, "Face AddFontMemResourceEx() failed");
-    free (data);
-    return NULL;
+  BOOL isSupported;
+  DWRITE_FONT_FILE_TYPE fileType;
+  DWRITE_FONT_FACE_TYPE faceType;
+  UINT32 numberOfFaces;
+  hr = fontFile->Analyze (&isSupported, &fileType, &faceType, &numberOfFaces);
+  if (FAILED (hr) || !isSupported) {
+    FAIL ("Font file is not supported.");
+    return false;
   }
 
+#undef FAIL
+
+  IDWriteFontFace *fontFace;
+  dwriteFactory->CreateFontFace (faceType, 1, &fontFile, 0,
+    DWRITE_FONT_SIMULATIONS_NONE, &fontFace);
+
+  data->dwriteFactory = dwriteFactory;
+  data->fontFile = fontFile;
+  data->fontFileStream = fontFileStream;
+  data->fontFileLoader = fontFileLoader;
+  data->fontFace = fontFace;
+  data->faceBlob = blob;
+
   return data;
 }
 
 void
 _hb_directwrite_shaper_face_data_destroy(hb_directwrite_shaper_face_data_t *data)
 {
-  RemoveFontMemResourceEx(data->fh);
-  free(data);
+  if (data->fontFace)
+    data->fontFace->Release ();
+  if (data->fontFile)
+    data->fontFile->Release ();
+  if (data->dwriteFactory) {
+    if (data->fontFileLoader)
+      data->dwriteFactory->UnregisterFontFileLoader(data->fontFileLoader);
+    data->dwriteFactory->Release();
+  }
+  if (data->fontFileLoader)
+    delete data->fontFileLoader;
+  if (data->fontFileStream)
+    delete data->fontFileStream;
+  if (data->faceBlob)
+    hb_blob_destroy (data->faceBlob);
+  if (data)
+    free (data);
 }
 
 
 /*
  * shaper font data
  */
 
 struct hb_directwrite_shaper_font_data_t {
-  HDC hdc;
-  LOGFONTW log_font;
-  HFONT hfont;
 };
 
-static bool
-populate_log_font (LOGFONTW  *lf,
-       hb_font_t *font)
-{
-  memset (lf, 0, sizeof (*lf));
-  lf->lfHeight = -font->y_scale;
-  lf->lfCharSet = DEFAULT_CHARSET;
-
-  hb_face_t *face = font->face;
-  hb_directwrite_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
-
-  memcpy (lf->lfFaceName, face_data->face_name, sizeof (lf->lfFaceName));
-
-  return true;
-}
-
 hb_directwrite_shaper_font_data_t *
 _hb_directwrite_shaper_font_data_create (hb_font_t *font)
 {
   if (unlikely (!hb_directwrite_shaper_face_data_ensure (font->face))) return NULL;
 
   hb_directwrite_shaper_font_data_t *data =
-    (hb_directwrite_shaper_font_data_t *) calloc (1, sizeof (hb_directwrite_shaper_font_data_t));
+    (hb_directwrite_shaper_font_data_t *) malloc (sizeof (hb_directwrite_shaper_font_data_t));
   if (unlikely (!data))
     return NULL;
 
-  data->hdc = GetDC (NULL);
-
-  if (unlikely (!populate_log_font (&data->log_font, font)))
-  {
-    DEBUG_MSG (DIRECTWRITE, font, "Font populate_log_font() failed");
-    _hb_directwrite_shaper_font_data_destroy (data);
-    return NULL;
-  }
-
-  data->hfont = CreateFontIndirectW (&data->log_font);
-  if (unlikely (!data->hfont))
-  {
-    DEBUG_MSG (DIRECTWRITE, font, "Font CreateFontIndirectW() failed");
-    _hb_directwrite_shaper_font_data_destroy (data);
-     return NULL;
-  }
-
-  if (!SelectObject (data->hdc, data->hfont))
-  {
-    DEBUG_MSG (DIRECTWRITE, font, "Font SelectObject() failed");
-    _hb_directwrite_shaper_font_data_destroy (data);
-     return NULL;
-  }
-
   return data;
 }
 
 void
 _hb_directwrite_shaper_font_data_destroy (hb_directwrite_shaper_font_data_t *data)
 {
-  if (data->hdc)
-    ReleaseDC (NULL, data->hdc);
-  if (data->hfont)
-    DeleteObject (data->hfont);
   free (data);
 }
 
-LOGFONTW *
-hb_directwrite_font_get_logfontw (hb_font_t *font)
-{
-  if (unlikely (!hb_directwrite_shaper_font_data_ensure (font))) return NULL;
-  hb_directwrite_shaper_font_data_t *font_data =  HB_SHAPER_DATA_GET (font);
-  return &font_data->log_font;
-}
-
-HFONT
-hb_directwrite_font_get_hfont (hb_font_t *font)
-{
-  if (unlikely (!hb_directwrite_shaper_font_data_ensure (font))) return NULL;
-  hb_directwrite_shaper_font_data_t *font_data =  HB_SHAPER_DATA_GET (font);
-  return font_data->hfont;
-}
-
 
 /*
  * shaper shape_plan data
  */
 
 struct hb_directwrite_shaper_shape_plan_data_t {};
 
 hb_directwrite_shaper_shape_plan_data_t *
@@ -322,17 +268,17 @@ hb_directwrite_shaper_shape_plan_data_t 
   return (hb_directwrite_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
 }
 
 void
 _hb_directwrite_shaper_shape_plan_data_destroy (hb_directwrite_shaper_shape_plan_data_t *data HB_UNUSED)
 {
 }
 
-// Most of here TextAnalysis is originally written by Bas Schouten for Mozilla project
+// Most of TextAnalysis is originally written by Bas Schouten for Mozilla project
 // but now is relicensed to MIT for HarfBuzz use
 class TextAnalysis
   : public IDWriteTextAnalysisSource, public IDWriteTextAnalysisSink
 {
 public:
 
   IFACEMETHOD(QueryInterface)(IID const& iid, OUT void** ppObject) { return S_OK; }
   IFACEMETHOD_(ULONG, AddRef)() { return 1; }
@@ -439,17 +385,18 @@ public:
     return S_OK;
   }
 
   IFACEMETHODIMP_(DWRITE_READING_DIRECTION)
     GetParagraphReadingDirection() { return mReadingDirection; }
 
   IFACEMETHODIMP GetLocaleName(uint32_t textPosition,
     uint32_t* textLength,
-    wchar_t const** localeName) {
+    wchar_t const** localeName)
+  {
     return S_OK;
   }
 
   IFACEMETHODIMP
     GetNumberSubstitution(uint32_t textPosition,
     OUT uint32_t* textLength,
     OUT IDWriteNumberSubstitution** numberSubstitution)
   {
@@ -464,17 +411,18 @@ public:
 
   IFACEMETHODIMP
     SetScriptAnalysis(uint32_t textPosition,
     uint32_t textLength,
     DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis)
   {
     SetCurrentRun(textPosition);
     SplitCurrentRun(textPosition);
-    while (textLength > 0) {
+    while (textLength > 0)
+    {
       Run *run = FetchNextRun(&textLength);
       run->mScript = *scriptAnalysis;
     }
 
     return S_OK;
   }
 
   IFACEMETHODIMP
@@ -497,59 +445,65 @@ protected:
   {
     // Used by the sink setters, this returns a reference to the next run.
     // Position and length are adjusted to now point after the current run
     // being returned.
 
     Run *origRun = mCurrentRun;
     // Split the tail if needed (the length remaining is less than the
     // current run's size).
-    if (*textLength < mCurrentRun->mTextLength) {
-      SplitCurrentRun(mCurrentRun->mTextStart + *textLength);
+    if (*textLength < mCurrentRun->mTextLength)
+    {
+      SplitCurrentRun (mCurrentRun->mTextStart + *textLength);
     }
-    else {
+    else
+    {
       // Just advance the current run.
       mCurrentRun = mCurrentRun->nextRun;
     }
     *textLength -= origRun->mTextLength;
 
     // Return a reference to the run that was just current.
     return origRun;
   }
 
   void SetCurrentRun(uint32_t textPosition)
   {
     // Move the current run to the given position.
     // Since the analyzers generally return results in a forward manner,
     // this will usually just return early. If not, find the
     // corresponding run for the text position.
 
-    if (mCurrentRun && mCurrentRun->ContainsTextPosition(textPosition)) {
+    if (mCurrentRun && mCurrentRun->ContainsTextPosition (textPosition))
+    {
       return;
     }
 
     for (Run *run = &mRunHead; run; run = run->nextRun) {
-      if (run->ContainsTextPosition(textPosition)) {
+      if (run->ContainsTextPosition (textPosition))
+      {
         mCurrentRun = run;
         return;
       }
     }
     //NS_NOTREACHED("We should always be able to find the text position in one \
             //                of our runs");
   }
 
   void SplitCurrentRun(uint32_t splitPosition)
   {
-    if (!mCurrentRun) {
+    if (!mCurrentRun)
+    {
       //NS_ASSERTION(false, "SplitCurrentRun called without current run.");
       // Shouldn't be calling this when no current run is set!
       return;
     }
     // Split the current run.
-    if (splitPosition <= mCurrentRun->mTextStart) {
+    if (splitPosition <= mCurrentRun->mTextStart)
+    {
       // No need to split, already the start of a run
       // or before it. Usually the first.
       return;
     }
     Run *newRun = (Run*) malloc (sizeof (Run));
 
     *newRun = *mCurrentRun;
 
@@ -595,42 +549,21 @@ hb_bool_t
   hb_font_t          *font,
   hb_buffer_t        *buffer,
   const hb_feature_t *features,
   unsigned int        num_features)
 {
   hb_face_t *face = font->face;
   hb_directwrite_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
   hb_directwrite_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
+  IDWriteFactory *dwriteFactory = face_data->dwriteFactory;
+  IDWriteFontFace *fontFace = face_data->fontFace;
 
-  // factory probably should be cached
-#ifndef HB_DIRECTWRITE_EXPERIMENTAL_JUSTIFICATION
-  IDWriteFactory* dwriteFactory;
-#else
-  IDWriteFactory1* dwriteFactory;
-#endif
-  DWriteCreateFactory (
-    DWRITE_FACTORY_TYPE_SHARED,
-    __uuidof (IDWriteFactory),
-    (IUnknown**) &dwriteFactory
-  );
-
-  IDWriteGdiInterop *gdiInterop;
-  dwriteFactory->GetGdiInterop (&gdiInterop);
-  IDWriteFontFace* fontFace;
-  gdiInterop->CreateFontFaceFromHdc (font_data->hdc, &fontFace);
-
-#ifndef HB_DIRECTWRITE_EXPERIMENTAL_JUSTIFICATION
   IDWriteTextAnalyzer* analyzer;
   dwriteFactory->CreateTextAnalyzer(&analyzer);
-#else
-  IDWriteTextAnalyzer* analyzer0;
-  dwriteFactory->CreateTextAnalyzer (&analyzer0);
-  IDWriteTextAnalyzer1* analyzer = (IDWriteTextAnalyzer1*) analyzer0;
-#endif
 
   unsigned int scratch_size;
   hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size);
 #define ALLOCATE_ARRAY(Type, name, len) \
   Type *name = (Type *) scratch; \
   { \
     unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \
     assert (_consumed <= scratch_size); \
@@ -648,17 +581,17 @@ hb_bool_t
     hb_codepoint_t c = buffer->info[i].codepoint;
     buffer->info[i].utf16_index() = chars_len;
     if (likely(c <= 0xFFFFu))
       textString[chars_len++] = c;
     else if (unlikely(c > 0x10FFFFu))
       textString[chars_len++] = 0xFFFDu;
     else {
       textString[chars_len++] = 0xD800u + ((c - 0x10000u) >> 10);
-      textString[chars_len++] = 0xDC00u + ((c - 0x10000u) & ((1 << 10) - 1));
+      textString[chars_len++] = 0xDC00u + ((c - 0x10000u) & ((1u << 10) - 1));
     }
   }
 
   ALLOCATE_ARRAY(WORD, log_clusters, chars_len);
   // if (num_features)
   {
     /* Need log_clusters to assign features. */
     chars_len = 0;
@@ -667,32 +600,32 @@ hb_bool_t
       hb_codepoint_t c = buffer->info[i].codepoint;
       unsigned int cluster = buffer->info[i].cluster;
       log_clusters[chars_len++] = cluster;
       if (hb_in_range(c, 0x10000u, 0x10FFFFu))
         log_clusters[chars_len++] = cluster; /* Surrogates. */
     }
   }
 
-  HRESULT hr;
   // TODO: Handle TEST_DISABLE_OPTIONAL_LIGATURES
 
   DWRITE_READING_DIRECTION readingDirection = buffer->props.direction ? 
     DWRITE_READING_DIRECTION_RIGHT_TO_LEFT :
     DWRITE_READING_DIRECTION_LEFT_TO_RIGHT;
 
   /*
   * There's an internal 16-bit limit on some things inside the analyzer,
   * but we never attempt to shape a word longer than 64K characters
   * in a single gfxShapedWord, so we cannot exceed that limit.
   */
   uint32_t textLength = buffer->len;
 
   TextAnalysis analysis(textString, textLength, NULL, readingDirection);
   TextAnalysis::Run *runHead;
+  HRESULT hr;
   hr = analysis.GenerateResults(analyzer, &runHead);
 
 #define FAIL(...) \
   HB_STMT_START { \
     DEBUG_MSG (DIRECTWRITE, NULL, __VA_ARGS__); \
     return false; \
   } HB_STMT_END;
 
@@ -726,34 +659,32 @@ hb_bool_t
       dwfeatureArray[i].parameter = features[i].value;
     }
     singleFeatures.features = dwfeatureArray;
   }
   const DWRITE_TYPOGRAPHIC_FEATURES* dwFeatures =
     (const DWRITE_TYPOGRAPHIC_FEATURES*) &singleFeatures;
   const uint32_t featureRangeLengths[] = { textLength };
 
+  uint16_t* clusterMap = (uint16_t*) malloc (textLength * sizeof (uint16_t));
+  DWRITE_SHAPING_TEXT_PROPERTIES* textProperties = (DWRITE_SHAPING_TEXT_PROPERTIES*)
+    malloc (textLength * sizeof (DWRITE_SHAPING_TEXT_PROPERTIES));
 retry_getglyphs:
-  uint16_t* clusterMap = (uint16_t*) malloc (maxGlyphCount * sizeof (uint16_t));
   uint16_t* glyphIndices = (uint16_t*) malloc (maxGlyphCount * sizeof (uint16_t));
-  DWRITE_SHAPING_TEXT_PROPERTIES* textProperties = (DWRITE_SHAPING_TEXT_PROPERTIES*)
-    malloc (maxGlyphCount * sizeof (DWRITE_SHAPING_TEXT_PROPERTIES));
   DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProperties = (DWRITE_SHAPING_GLYPH_PROPERTIES*)
     malloc (maxGlyphCount * sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES));
 
   hr = analyzer->GetGlyphs (textString, textLength, fontFace, FALSE,
     isRightToLeft, &runHead->mScript, localeName, NULL, &dwFeatures,
     featureRangeLengths, 1, maxGlyphCount, clusterMap, textProperties, glyphIndices,
     glyphProperties, &glyphCount);
 
   if (unlikely (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER)))
   {
-    free (clusterMap);
     free (glyphIndices);
-    free (textProperties);
     free (glyphProperties);
 
     maxGlyphCount *= 2;
 
     goto retry_getglyphs;
   }
   if (FAILED (hr))
   {
@@ -794,116 +725,119 @@ retry_getglyphs:
     glyphAdvances, glyphOffsets);
 
   if (FAILED (hr))
   {
     FAIL ("Analyzer failed to get glyph placements.");
     return false;
   }
 
-#ifdef HB_DIRECTWRITE_EXPERIMENTAL_JUSTIFICATION
+  // TODO: get lineWith from somewhere
+  float lineWidth = 0;
 
-  DWRITE_JUSTIFICATION_OPPORTUNITY* justificationOpportunities =
-    (DWRITE_JUSTIFICATION_OPPORTUNITY*)
-    malloc (maxGlyphCount * sizeof (DWRITE_JUSTIFICATION_OPPORTUNITY));
-  hr = analyzer->GetJustificationOpportunities (fontFace, fontEmSize,
-    runHead->mScript, textLength, glyphCount, textString, clusterMap,
-    glyphProperties, justificationOpportunities);
+  IDWriteTextAnalyzer1* analyzer1;
+  analyzer->QueryInterface (&analyzer1);
 
-  if (FAILED (hr))
+  if (analyzer1 && lineWidth)
   {
-    FAIL ("Analyzer failed to get justification opportunities.");
-    return false;
-  }
-
-  // TODO: get lineWith from somewhere
-  float lineWidth = 60000;
 
-  float* justifiedGlyphAdvances =
-    (float*) malloc (maxGlyphCount * sizeof (float));
-  DWRITE_GLYPH_OFFSET* justifiedGlyphOffsets = (DWRITE_GLYPH_OFFSET*)
-    malloc (glyphCount * sizeof (DWRITE_GLYPH_OFFSET));
-  hr = analyzer->JustifyGlyphAdvances (lineWidth, glyphCount, justificationOpportunities,
-    glyphAdvances, glyphOffsets, justifiedGlyphAdvances, justifiedGlyphOffsets);
+    DWRITE_JUSTIFICATION_OPPORTUNITY* justificationOpportunities =
+      (DWRITE_JUSTIFICATION_OPPORTUNITY*)
+      malloc (maxGlyphCount * sizeof (DWRITE_JUSTIFICATION_OPPORTUNITY));
+    hr = analyzer1->GetJustificationOpportunities (fontFace, fontEmSize,
+      runHead->mScript, textLength, glyphCount, textString, clusterMap,
+      glyphProperties, justificationOpportunities);
+
+    if (FAILED (hr))
+    {
+      FAIL ("Analyzer failed to get justification opportunities.");
+      return false;
+    }
 
-  if (FAILED (hr))
-  {
-    FAIL ("Analyzer failed to get justified glyph advances.");
-    return false;
-  }
+    float* justifiedGlyphAdvances =
+      (float*) malloc (maxGlyphCount * sizeof (float));
+    DWRITE_GLYPH_OFFSET* justifiedGlyphOffsets = (DWRITE_GLYPH_OFFSET*)
+      malloc (glyphCount * sizeof (DWRITE_GLYPH_OFFSET));
+    hr = analyzer1->JustifyGlyphAdvances (lineWidth, glyphCount, justificationOpportunities,
+      glyphAdvances, glyphOffsets, justifiedGlyphAdvances, justifiedGlyphOffsets);
+
+    if (FAILED (hr))
+    {
+      FAIL("Analyzer failed to get justified glyph advances.");
+      return false;
+    }
 
-  DWRITE_SCRIPT_PROPERTIES scriptProperties;
-  hr = analyzer->GetScriptProperties (runHead->mScript, &scriptProperties);
-  if (FAILED (hr))
-  {
-    FAIL ("Analyzer failed to get script properties.");
-    return false;
-  }
-  uint32_t justificationCharacter = scriptProperties.justificationCharacter;
+    DWRITE_SCRIPT_PROPERTIES scriptProperties;
+    hr = analyzer1->GetScriptProperties (runHead->mScript, &scriptProperties);
+    if (FAILED (hr))
+    {
+      FAIL("Analyzer failed to get script properties.");
+      return false;
+    }
+    uint32_t justificationCharacter = scriptProperties.justificationCharacter;
 
-  // if a script justificationCharacter is not space, it can have GetJustifiedGlyphs
-  if (justificationCharacter != 32)
-  {
-retry_getjustifiedglyphs:
-    uint16_t* modifiedClusterMap = (uint16_t*) malloc (maxGlyphCount * sizeof (uint16_t));
-    uint16_t* modifiedGlyphIndices = (uint16_t*) malloc (maxGlyphCount * sizeof (uint16_t));
-    float* modifiedGlyphAdvances = (float*) malloc (maxGlyphCount * sizeof (float));
-    DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets = (DWRITE_GLYPH_OFFSET*)
-      malloc (maxGlyphCount * sizeof (DWRITE_GLYPH_OFFSET));
-    uint32_t actualGlyphsCount;
-    hr = analyzer->GetJustifiedGlyphs (fontFace, fontEmSize, runHead->mScript,
+    // if a script justificationCharacter is not space, it can have GetJustifiedGlyphs
+    if (justificationCharacter != 32)
+    {
+      uint16_t* modifiedClusterMap = (uint16_t*) malloc (textLength * sizeof (uint16_t));
+    retry_getjustifiedglyphs:
+      uint16_t* modifiedGlyphIndices = (uint16_t*) malloc (maxGlyphCount * sizeof (uint16_t));
+      float* modifiedGlyphAdvances = (float*) malloc (maxGlyphCount * sizeof (float));
+      DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets = (DWRITE_GLYPH_OFFSET*)
+        malloc (maxGlyphCount * sizeof (DWRITE_GLYPH_OFFSET));
+      uint32_t actualGlyphsCount;
+      hr = analyzer1->GetJustifiedGlyphs (fontFace, fontEmSize, runHead->mScript,
         textLength, glyphCount, maxGlyphCount, clusterMap, glyphIndices,
         glyphAdvances, justifiedGlyphAdvances, justifiedGlyphOffsets,
         glyphProperties, &actualGlyphsCount, modifiedClusterMap, modifiedGlyphIndices,
         modifiedGlyphAdvances, modifiedGlyphOffsets);
 
-    if (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER))
-    {
-      maxGlyphCount = actualGlyphsCount;
-      free (modifiedClusterMap);
-      free (modifiedGlyphIndices);
-      free (modifiedGlyphAdvances);
-      free (modifiedGlyphOffsets);
+      if (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER))
+      {
+        maxGlyphCount = actualGlyphsCount;
+        free (modifiedGlyphIndices);
+        free (modifiedGlyphAdvances);
+        free (modifiedGlyphOffsets);
+
+        maxGlyphCount = actualGlyphsCount;
+
+        goto retry_getjustifiedglyphs;
+      }
+      if (FAILED (hr))
+      {
+        FAIL ("Analyzer failed to get justified glyphs.");
+        return false;
+      }
 
-      maxGlyphCount = actualGlyphsCount;
+      free (clusterMap);
+      free (glyphIndices);
+      free (glyphAdvances);
+      free (glyphOffsets);
 
-      goto retry_getjustifiedglyphs;
+      glyphCount = actualGlyphsCount;
+      clusterMap = modifiedClusterMap;
+      glyphIndices = modifiedGlyphIndices;
+      glyphAdvances = modifiedGlyphAdvances;
+      glyphOffsets = modifiedGlyphOffsets;
+
+      free (justifiedGlyphAdvances);
+      free (justifiedGlyphOffsets);
     }
-    if (FAILED (hr))
+    else
     {
-      FAIL ("Analyzer failed to get justified glyphs.");
-      return false;
+      free (glyphAdvances);
+      free (glyphOffsets);
+
+      glyphAdvances = justifiedGlyphAdvances;
+      glyphOffsets = justifiedGlyphOffsets;
     }
 
-    free (clusterMap);
-    free (glyphIndices);
-    free (glyphAdvances);
-    free (glyphOffsets);
-
-    glyphCount = actualGlyphsCount;
-    clusterMap = modifiedClusterMap;
-    glyphIndices = modifiedGlyphIndices;
-    glyphAdvances = modifiedGlyphAdvances;
-    glyphOffsets = modifiedGlyphOffsets;
+    free (justificationOpportunities);
 
-    free(justifiedGlyphAdvances);
-    free(justifiedGlyphOffsets);
   }
-  else
-  {
-    free(glyphAdvances);
-    free(glyphOffsets);
-
-    glyphAdvances = justifiedGlyphAdvances;
-    glyphOffsets = justifiedGlyphOffsets;
-  }
-
-  free(justificationOpportunities);
-
-#endif
 
   /* Ok, we've got everything we need, now compose output buffer,
    * very, *very*, carefully! */
 
   /* Calculate visual-clusters.  That's what we ship. */
   for (unsigned int i = 0; i < glyphCount; i++)
     vis_clusters[i] = -1;
   for (unsigned int i = 0; i < buffer->len; i++)
--- a/gfx/harfbuzz/src/hb-directwrite.h
+++ b/gfx/harfbuzz/src/hb-directwrite.h
@@ -26,9 +26,9 @@
 #define HB_DIRECTWRITE_H
 
 #include "hb.h"
 
 HB_BEGIN_DECLS
 
 HB_END_DECLS
 
-#endif /* HB_UNISCRIBE_H */
+#endif /* HB_DIRECTWRITE_H */
--- a/gfx/harfbuzz/src/hb-face.cc
+++ b/gfx/harfbuzz/src/hb-face.cc
@@ -30,18 +30,16 @@
 
 #include "hb-ot-layout-private.hh"
 
 #include "hb-font-private.hh"
 #include "hb-open-file-private.hh"
 #include "hb-ot-head-table.hh"
 #include "hb-ot-maxp-table.hh"
 
-#include "hb-cache-private.hh"
-
 #include <string.h>
 
 
 /*
  * hb_face_t
  */
 
 const hb_face_t _hb_face_nil = {
--- a/gfx/harfbuzz/src/hb-font-private.hh
+++ b/gfx/harfbuzz/src/hb-font-private.hh
@@ -500,17 +500,23 @@ struct hb_font_t {
 	  get_nominal_glyph (unichar, glyph))
 	return true;
     }
 
     return false;
   }
 
   private:
-  inline hb_position_t em_scale (int16_t v, int scale) { return (hb_position_t) (v * (int64_t) scale / face->get_upem ()); }
+  inline hb_position_t em_scale (int16_t v, int scale)
+  {
+    int upem = face->get_upem ();
+    int64_t scaled = v * (int64_t) scale;
+    scaled += scaled >= 0 ? upem/2 : -upem/2; /* Round. */
+    return (hb_position_t) (scaled / upem);
+  }
 };
 
 #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, font);
 #include "hb-shaper-list.hh"
 #undef HB_SHAPER_IMPLEMENT
 #undef HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
 
--- a/gfx/harfbuzz/src/hb-font.cc
+++ b/gfx/harfbuzz/src/hb-font.cc
@@ -30,18 +30,16 @@
 
 #include "hb-ot-layout-private.hh"
 
 #include "hb-font-private.hh"
 #include "hb-open-file-private.hh"
 #include "hb-ot-head-table.hh"
 #include "hb-ot-maxp-table.hh"
 
-#include "hb-cache-private.hh"
-
 #include <string.h>
 
 
 /*
  * hb_font_funcs_t
  */
 
 static hb_bool_t
@@ -153,16 +151,17 @@ hb_font_get_glyph_h_advance_parent (hb_f
 }
 
 static hb_position_t
 hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED,
 				 void *font_data HB_UNUSED,
 				 hb_codepoint_t glyph,
 				 void *user_data HB_UNUSED)
 {
+  /* TODO use font_extents.ascender+descender */
   return font->y_scale;
 }
 static hb_position_t
 hb_font_get_glyph_v_advance_parent (hb_font_t *font,
 				    void *font_data HB_UNUSED,
 				    hb_codepoint_t glyph,
 				    void *user_data HB_UNUSED)
 {
--- a/gfx/harfbuzz/src/hb-ft.cc
+++ b/gfx/harfbuzz/src/hb-ft.cc
@@ -28,16 +28,18 @@
  */
 
 #include "hb-private.hh"
 
 #include "hb-ft.h"
 
 #include "hb-font-private.hh"
 
+#include "hb-cache-private.hh" // Maybe use in the future?
+
 #include FT_ADVANCES_H
 #include FT_TRUETYPE_TABLES_H
 
 
 
 #ifndef HB_DEBUG_FT
 #define HB_DEBUG_FT (HB_DEBUG+0)
 #endif
@@ -65,40 +67,48 @@
  *   - FT_Load_Glyph() is exteremely costly.  Do something about it?
  */
 
 
 struct hb_ft_font_t
 {
   FT_Face ft_face;
   int load_flags;
+  bool symbol; /* Whether selected cmap is symbol cmap. */
   bool unref; /* Whether to destroy ft_face when done. */
 };
 
 static hb_ft_font_t *
-_hb_ft_font_create (FT_Face ft_face, bool unref)
+_hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref)
 {
   hb_ft_font_t *ft_font = (hb_ft_font_t *) calloc (1, sizeof (hb_ft_font_t));
 
   if (unlikely (!ft_font))
     return NULL;
 
   ft_font->ft_face = ft_face;
+  ft_font->symbol = symbol;
   ft_font->unref = unref;
 
   ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
 
   return ft_font;
 }
 
 static void
+_hb_ft_face_destroy (FT_Face ft_face)
+{
+  FT_Done_Face (ft_face);
+}
+
+static void
 _hb_ft_font_destroy (hb_ft_font_t *ft_font)
 {
   if (ft_font->unref)
-    FT_Done_Face (ft_font->ft_face);
+    _hb_ft_face_destroy (ft_font->ft_face);
 
   free (ft_font);
 }
 
 /**
  * hb_ft_font_set_load_flags:
  * @font:
  * @load_flags:
@@ -160,17 +170,31 @@ hb_ft_get_nominal_glyph (hb_font_t *font
 			 hb_codepoint_t unicode,
 			 hb_codepoint_t *glyph,
 			 void *user_data HB_UNUSED)
 {
   const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
   unsigned int g = FT_Get_Char_Index (ft_font->ft_face, unicode);
 
   if (unlikely (!g))
-    return false;
+  {
+    if (unlikely (ft_font->symbol) && unicode <= 0x00FFu)
+    {
+      /* For symbol-encoded OpenType fonts, we duplicate the
+       * U+F000..F0FF range at U+0000..U+00FF.  That's what
+       * Windows seems to do, and that's hinted about at:
+       * http://www.microsoft.com/typography/otspec/recom.htm
+       * under "Non-Standard (Symbol) Fonts". */
+      g = FT_Get_Char_Index (ft_font->ft_face, 0xF000u + unicode);
+      if (!g)
+	return false;
+    }
+    else
+      return false;
+  }
 
   *glyph = g;
   return true;
 }
 
 static hb_bool_t
 hb_ft_get_variation_glyph (hb_font_t *font HB_UNUSED,
 			   void *font_data,
@@ -439,19 +463,21 @@ retry:
       goto retry;
     }
 
 #ifdef HB_USE_ATEXIT
     atexit (free_static_ft_funcs); /* First person registers atexit() callback. */
 #endif
   };
 
+  bool symbol = ft_face->charmap && ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL;
+
   hb_font_set_funcs (font,
 		     funcs,
-		     _hb_ft_font_create (ft_face, unref),
+		     _hb_ft_font_create (ft_face, symbol, unref),
 		     (hb_destroy_func_t) _hb_ft_font_destroy);
 }
 
 
 static hb_blob_t *
 reference_table  (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
 {
   FT_Face ft_face = (FT_Face) user_data;
@@ -521,17 +547,17 @@ hb_ft_face_create (FT_Face           ft_
  *
  * Return value: (transfer full): 
  * Since: 0.9.38
  **/
 hb_face_t *
 hb_ft_face_create_referenced (FT_Face ft_face)
 {
   FT_Reference_Face (ft_face);
-  return hb_ft_face_create (ft_face, (hb_destroy_func_t) FT_Done_Face);
+  return hb_ft_face_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy);
 }
 
 static void
 hb_ft_face_finalize (FT_Face ft_face)
 {
   hb_face_destroy ((hb_face_t *) ft_face->generic.data);
 }
 
@@ -577,18 +603,18 @@ hb_ft_font_create (FT_Face           ft_
   hb_font_t *font;
   hb_face_t *face;
 
   face = hb_ft_face_create (ft_face, destroy);
   font = hb_font_create (face);
   hb_face_destroy (face);
   _hb_ft_font_set_funcs (font, ft_face, false);
   hb_font_set_scale (font,
-		     (int) (((uint64_t) ft_face->size->metrics.x_scale * (uint64_t) ft_face->units_per_EM + (1<<15)) >> 16),
-		     (int) (((uint64_t) ft_face->size->metrics.y_scale * (uint64_t) ft_face->units_per_EM + (1<<15)) >> 16));
+		     (int) (((uint64_t) ft_face->size->metrics.x_scale * (uint64_t) ft_face->units_per_EM + (1u<<15)) >> 16),
+		     (int) (((uint64_t) ft_face->size->metrics.y_scale * (uint64_t) ft_face->units_per_EM + (1u<<15)) >> 16));
 #if 0 /* hb-ft works in no-hinting model */
   hb_font_set_ppem (font,
 		    ft_face->size->metrics.x_ppem,
 		    ft_face->size->metrics.y_ppem);
 #endif
 
   return font;
 }
@@ -601,17 +627,17 @@ hb_ft_font_create (FT_Face           ft_
  *
  * Return value: (transfer full): 
  * Since: 0.9.38
  **/
 hb_font_t *
 hb_ft_font_create_referenced (FT_Face ft_face)
 {
   FT_Reference_Face (ft_face);
-  return hb_ft_font_create (ft_face, (hb_destroy_func_t) FT_Done_Face);
+  return hb_ft_font_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy);
 }
 
 
 /* Thread-safe, lock-free, FT_Library */
 
 static FT_Library ft_library;
 
 #ifdef HB_USE_ATEXIT
@@ -670,17 +696,18 @@ hb_ft_font_set_funcs (hb_font_t *font)
 				     &ft_face);
 
   if (unlikely (err)) {
     hb_blob_destroy (blob);
     DEBUG_MSG (FT, font, "Font face FT_New_Memory_Face() failed");
     return;
   }
 
-  FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE);
+  if (FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE))
+    FT_Select_Charmap (ft_face, FT_ENCODING_MS_SYMBOL);
 
   FT_Set_Char_Size (ft_face,
 		    abs (font->x_scale), abs (font->y_scale),
 		    0, 0);
 #if 0
 		    font->x_ppem * 72 * 64 / font->x_scale,
 		    font->y_ppem * 72 * 64 / font->y_scale);
 #endif
--- a/gfx/harfbuzz/src/hb-gobject-structs.h
+++ b/gfx/harfbuzz/src/hb-gobject-structs.h
@@ -36,52 +36,64 @@
 #include <glib-object.h>
 
 HB_BEGIN_DECLS
 
 
 /* Object types */
 
 /**
+ * hb_gobject_blob_get_type:
+ *
  * Since: 0.9.2
  **/
 HB_EXTERN GType hb_gobject_blob_get_type (void);
 #define HB_GOBJECT_TYPE_BLOB (hb_gobject_blob_get_type ())
 
 /**
+ * hb_gobject_buffer_get_type:
+ *
  * Since: 0.9.2
  **/
 HB_EXTERN GType hb_gobject_buffer_get_type (void);
 #define HB_GOBJECT_TYPE_BUFFER (hb_gobject_buffer_get_type ())
 
 /**
+ * hb_gobject_face_get_type:
+ *
  * Since: 0.9.2
  **/
 HB_EXTERN GType hb_gobject_face_get_type (void);
 #define HB_GOBJECT_TYPE_FACE (hb_gobject_face_get_type ())
 
 /**
+ * hb_gobject_font_get_type:
+ *
  * Since: 0.9.2
  **/
 HB_EXTERN GType hb_gobject_font_get_type (void);
 #define HB_GOBJECT_TYPE_FONT (hb_gobject_font_get_type ())
 
 /**
+ * hb_gobject_font_funcs_get_type:
+ *
  * Since: 0.9.2
  **/
 HB_EXTERN GType hb_gobject_font_funcs_get_type (void);
 #define HB_GOBJECT_TYPE_FONT_FUNCS (hb_gobject_font_funcs_get_type ())
 
 HB_EXTERN GType hb_gobject_set_get_type (void);
 #define HB_GOBJECT_TYPE_SET (hb_gobject_set_get_type ())
 
 HB_EXTERN GType hb_gobject_shape_plan_get_type (void);
 #define HB_GOBJECT_TYPE_SHAPE_PLAN (hb_gobject_shape_plan_get_type ())
 
 /**
+ * hb_gobject_unicode_funcs_get_type:
+ *
  * Since: 0.9.2
  **/
 HB_EXTERN GType hb_gobject_unicode_funcs_get_type (void);
 #define HB_GOBJECT_TYPE_UNICODE_FUNCS (hb_gobject_unicode_funcs_get_type ())
 
 /* Value types */
 
 HB_EXTERN GType hb_gobject_feature_get_type (void);
--- a/gfx/harfbuzz/src/hb-open-type-private.hh
+++ b/gfx/harfbuzz/src/hb-open-type-private.hh
@@ -96,17 +96,18 @@ static inline Type& StructAfter(TObject 
   { _code; }
 # define _DEFINE_COMPILES_ASSERTION0(_line, _code) _DEFINE_COMPILES_ASSERTION1 (_line, _code)
 # define DEFINE_COMPILES_ASSERTION(_code) _DEFINE_COMPILES_ASSERTION0 (__LINE__, _code)
 
 
 #define DEFINE_SIZE_STATIC(size) \
   DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \
   static const unsigned int static_size = (size); \
-  static const unsigned int min_size = (size)
+  static const unsigned int min_size = (size); \
+  inline unsigned int get_size (void) const { return (size); }
 
 #define DEFINE_SIZE_UNION(size, _member) \
   DEFINE_INSTANCE_ASSERTION (this->u._member.static_size == (size)); \
   static const unsigned int min_size = (size)
 
 #define DEFINE_SIZE_MIN(size) \
   DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)); \
   static const unsigned int min_size = (size)
@@ -666,16 +667,25 @@ typedef USHORT UFWORD;
 struct F2DOT14 : SHORT
 {
   //inline float to_float (void) const { return ???; }
   //inline void set_float (float f) { v.set (f * ???); }
   public:
   DEFINE_SIZE_STATIC (2);
 };
 
+/* 32-bit signed fixed-point number (16.16). */
+struct Fixed: LONG
+{
+  //inline float to_float (void) const { return ???; }
+  //inline void set_float (float f) { v.set (f * ???); }
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
 /* Date represented in number of seconds since 12:00 midnight, January 1,
  * 1904. The value is represented as a signed 64-bit integer. */
 struct LONGDATETIME
 {
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this)));
--- a/gfx/harfbuzz/src/hb-ot-font.cc
+++ b/gfx/harfbuzz/src/hb-ot-font.cc
@@ -31,16 +31,17 @@
 #include "hb-font-private.hh"
 
 #include "hb-ot-cmap-table.hh"
 #include "hb-ot-glyf-table.hh"
 #include "hb-ot-head-table.hh"
 #include "hb-ot-hhea-table.hh"
 #include "hb-ot-hmtx-table.hh"
 #include "hb-ot-os2-table.hh"
+//#include "hb-ot-post-table.hh"
 
 
 struct hb_ot_face_metrics_accelerator_t
 {
   unsigned int num_metrics;
   unsigned int num_advances;
   unsigned int default_advance;
   unsigned short ascender;
@@ -209,71 +210,97 @@ template <typename Type>
 static inline bool get_glyph_from (const void *obj,
 				   hb_codepoint_t codepoint,
 				   hb_codepoint_t *glyph)
 {
   const Type *typed_obj = (const Type *) obj;
   return typed_obj->get_glyph (codepoint, glyph);
 }
 
+template <typename Type>
+static inline bool get_glyph_from_symbol (const void *obj,
+					  hb_codepoint_t codepoint,
+					  hb_codepoint_t *glyph)
+{
+  const Type *typed_obj = (const Type *) obj;
+  if (likely (typed_obj->get_glyph (codepoint, glyph)))
+    return true;
+
+  if (codepoint <= 0x00FFu)
+  {
+    /* For symbol-encoded OpenType fonts, we duplicate the
+     * U+F000..F0FF range at U+0000..U+00FF.  That's what
+     * Windows seems to do, and that's hinted about at:
+     * http://www.microsoft.com/typography/otspec/recom.htm
+     * under "Non-Standard (Symbol) Fonts". */
+    return typed_obj->get_glyph (0xF000u + codepoint, glyph);
+  }
+
+  return false;
+}
+
 struct hb_ot_face_cmap_accelerator_t
 {
   hb_cmap_get_glyph_func_t get_glyph_func;
   const void *get_glyph_data;
   OT::CmapSubtableFormat4::accelerator_t format4_accel;
 
   const OT::CmapSubtableFormat14 *uvs_table;
   hb_blob_t *blob;
 
   inline void init (hb_face_t *face)
   {
     this->blob = OT::Sanitizer<OT::cmap>::sanitize (face->reference_table (HB_OT_TAG_cmap));
     const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (this->blob);
     const OT::CmapSubtable *subtable = NULL;
     const OT::CmapSubtableFormat14 *subtable_uvs = NULL;
 
+    bool symbol = false;
     /* 32-bit subtables. */
     if (!subtable) subtable = cmap->find_subtable (3, 10);
     if (!subtable) subtable = cmap->find_subtable (0, 6);
     if (!subtable) subtable = cmap->find_subtable (0, 4);
     /* 16-bit subtables. */
     if (!subtable) subtable = cmap->find_subtable (3, 1);
     if (!subtable) subtable = cmap->find_subtable (0, 3);
     if (!subtable) subtable = cmap->find_subtable (0, 2);
     if (!subtable) subtable = cmap->find_subtable (0, 1);
     if (!subtable) subtable = cmap->find_subtable (0, 0);
-    if (!subtable) subtable = cmap->find_subtable (3, 0);
+    if (!subtable)(subtable = cmap->find_subtable (3, 0)) && (symbol = true);
     /* Meh. */
     if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
 
     /* UVS subtable. */
     if (!subtable_uvs)
     {
       const OT::CmapSubtable *st = cmap->find_subtable (0, 5);
       if (st && st->u.format == 14)
         subtable_uvs = &st->u.format14;
     }
     /* Meh. */
     if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtableFormat14);
 
     this->uvs_table = subtable_uvs;
 
     this->get_glyph_data = subtable;
-    switch (subtable->u.format) {
-    /* Accelerate format 4 and format 12. */
-    default: this->get_glyph_func = get_glyph_from<OT::CmapSubtable>;		break;
-    case 12: this->get_glyph_func = get_glyph_from<OT::CmapSubtableFormat12>;	break;
-    case  4:
-      {
-        this->format4_accel.init (&subtable->u.format4);
-	this->get_glyph_data = &this->format4_accel;
-        this->get_glyph_func = this->format4_accel.get_glyph_func;
+    if (unlikely (symbol))
+      this->get_glyph_func = get_glyph_from_symbol<OT::CmapSubtable>;
+    else
+      switch (subtable->u.format) {
+      /* Accelerate format 4 and format 12. */
+      default: this->get_glyph_func = get_glyph_from<OT::CmapSubtable>;		break;
+      case 12: this->get_glyph_func = get_glyph_from<OT::CmapSubtableFormat12>;	break;
+      case  4:
+	{
+	  this->format4_accel.init (&subtable->u.format4);
+	  this->get_glyph_data = &this->format4_accel;
+	  this->get_glyph_func = this->format4_accel.get_glyph_func;
+	}
+	break;
       }
-      break;
-    }
   }
 
   inline void fini (void)
   {
     hb_blob_destroy (this->blob);
   }
 
   inline bool get_nominal_glyph (hb_codepoint_t  unicode,
@@ -294,23 +321,64 @@ struct hb_ot_face_cmap_accelerator_t
       case OT::GLYPH_VARIANT_FOUND:		return true;
       case OT::GLYPH_VARIANT_USE_DEFAULT:	break;
     }
 
     return get_nominal_glyph (unicode, glyph);
   }
 };
 
+template <typename T>
+struct hb_lazy_loader_t
+{
+  inline void init (hb_face_t *face_)
+  {
+    face = face_;
+    instance = NULL;
+  }
+
+  inline void fini (void)
+  {
+    if (instance && instance != &OT::Null(T))
+    {
+      instance->fini();
+      free (instance);
+    }
+  }
+
+  inline const T* operator-> (void) const
+  {
+  retry:
+    T *p = (T *) hb_atomic_ptr_get (&instance);
+    if (unlikely (!p))
+    {
+      p = (T *) calloc (1, sizeof (T));
+      if (unlikely (!p))
+        return &OT::Null(T);
+      p->init (face);
+      if (unlikely (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), NULL, p)))
+      {
+	p->fini ();
+	goto retry;
+      }
+    }
+    return p;
+  }
+
+  private:
+  hb_face_t *face;
+  T *instance;
+};
 
 struct hb_ot_font_t
 {
   hb_ot_face_cmap_accelerator_t cmap;
   hb_ot_face_metrics_accelerator_t h_metrics;
   hb_ot_face_metrics_accelerator_t v_metrics;
-  hb_ot_face_glyf_accelerator_t glyf;
+  hb_lazy_loader_t<hb_ot_face_glyf_accelerator_t> glyf;
 };
 
 
 static hb_ot_font_t *
 _hb_ot_font_create (hb_face_t *face)
 {
   hb_ot_font_t *ot_font = (hb_ot_font_t *) calloc (1, sizeof (hb_ot_font_t));
 
@@ -384,17 +452,17 @@ hb_ot_get_glyph_v_advance (hb_font_t *fo
 static hb_bool_t
 hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
 			 void *font_data,
 			 hb_codepoint_t glyph,
 			 hb_glyph_extents_t *extents,
 			 void *user_data HB_UNUSED)
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
-  bool ret = ot_font->glyf.get_extents (glyph, extents);
+  bool ret = ot_font->glyf->get_extents (glyph, extents);
   extents->x_bearing = font->em_scale_x (extents->x_bearing);
   extents->y_bearing = font->em_scale_y (extents->y_bearing);
   extents->width     = font->em_scale_x (extents->width);
   extents->height    = font->em_scale_y (extents->height);
   return ret;
 }
 
 static hb_bool_t
--- a/gfx/harfbuzz/src/hb-ot-layout-common-private.hh
+++ b/gfx/harfbuzz/src/hb-ot-layout-common-private.hh
@@ -765,17 +765,21 @@ struct CoverageFormat2
 
   inline bool serialize (hb_serialize_context_t *c,
 			 Supplier<GlyphID> &glyphs,
 			 unsigned int num_glyphs)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (*this))) return_trace (false);
 
-    if (unlikely (!num_glyphs)) return_trace (true);
+    if (unlikely (!num_glyphs))
+    {
+      rangeRecord.len.set (0);
+      return_trace (true);
+    }
 
     unsigned int num_ranges = 1;
     for (unsigned int i = 1; i < num_glyphs; i++)
       if (glyphs[i - 1] + 1 != glyphs[i])
         num_ranges++;
     rangeRecord.len.set (num_ranges);
     if (unlikely (!c->extend (rangeRecord))) return_trace (false);
 
--- a/gfx/harfbuzz/src/hb-ot-layout-gsub-table.hh
+++ b/gfx/harfbuzz/src/hb-ot-layout-gsub-table.hh
@@ -260,33 +260,30 @@ struct Sequence
       c->output->add (substitute[i]);
   }
 
   inline bool apply (hb_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int count = substitute.len;
 
-    /* TODO:
-     * Testing shows that Uniscribe actually allows zero-len susbstitute,
-     * which essentially deletes a glyph.  We don't allow for now.  It
-     * can be confusing to the client since the cluster from the deleted
-     * glyph won't be merged with any output cluster...  Also, currently
-     * buffer->move_to() makes assumptions about this too.  Perhaps fix
-     * in the future after figuring out what to do with the clusters.
-     */
-    if (unlikely (!count)) return_trace (false);
-
     /* Special-case to make it in-place and not consider this
      * as a "multiplied" substitution. */
     if (unlikely (count == 1))
     {
       c->replace_glyph (substitute.array[0]);
       return_trace (true);
     }
+    /* Spec disallows this, but Uniscribe allows it.
+     * https://github.com/behdad/harfbuzz/issues/253 */
+    else if (unlikely (count == 0))
+    {
+      c->buffer->delete_glyph ();
+      return_trace (true);
+    }
 
     unsigned int klass = _hb_glyph_info_is_ligature (&c->buffer->cur()) ?
 			 HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0;
 
     for (unsigned int i = 0; i < count; i++) {
       _hb_glyph_info_set_lig_props_for_component (&c->buffer->cur(), i);
       c->output_glyph_for_component (substitute.array[i], klass);
     }
--- a/gfx/harfbuzz/src/hb-ot-layout-gsubgpos-private.hh
+++ b/gfx/harfbuzz/src/hb-ot-layout-gsubgpos-private.hh
@@ -314,17 +314,17 @@ struct hb_apply_context_t :
 
     inline may_skip_t
     may_skip (const hb_apply_context_t *c,
 	      const hb_glyph_info_t    &info) const
     {
       if (!c->check_glyph_property (&info, lookup_props))
 	return SKIP_YES;
 
-      if (unlikely (_hb_glyph_info_is_default_ignorable (&info) &&
+      if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_fvs (&info) &&
 		    (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
 		    (ignore_zwj || !_hb_glyph_info_is_zwj (&info))))
 	return SKIP_MAYBE;
 
       return SKIP_NO;
     }
 
     protected:
@@ -991,20 +991,23 @@ static inline bool apply_lookup (hb_appl
     unsigned int new_len = buffer->backtrack_len () + buffer->lookahead_len ();
     int delta = new_len - orig_len;
 
     if (!delta)
         continue;
 
     /* Recursed lookup changed buffer len.  Adjust. */
 
-    /* end can't go back past the current match position.
-     * Note: this is only true because we do NOT allow MultipleSubst
-     * with zero sequence len. */
-    end = MAX (MIN((int) match_positions[idx] + 1, (int) new_len), int (end) + delta);
+    end = int (end) + delta;
+    if (end <= match_positions[idx])
+    {
+      /* There can't be any further changes. */
+      assert (end == match_positions[idx]);
+      break;
+    }
 
     unsigned int next = idx + 1; /* next now is the position after the recursed lookup. */
 
     if (delta > 0)
     {
       if (unlikely (delta + count > HB_MAX_CONTEXT_LENGTH))
 	break;
     }
--- a/gfx/harfbuzz/src/hb-ot-layout-private.hh
+++ b/gfx/harfbuzz/src/hb-ot-layout-private.hh
@@ -213,33 +213,34 @@ static inline unsigned int
 
 /* unicode_props */
 
 /* Design:
  * unicode_props() is a two-byte number.  The low byte includes:
  * - General_Category: 5 bits.
  * - A bit each for:
  *   * Is it Default_Ignorable(); we have a modified Default_Ignorable().
- *   * Is it U+200D ZWJ?
- *   * Is it U+200C ZWNJ?
+ *   * Whether it's one of the three Mongolian Free Variation Selectors.
+ *   * One free bit right now.
  *
  * The high-byte has different meanings, switched by the Gen-Cat:
  * - For Mn,Mc,Me: the modified Combining_Class.
+ * - For Cf: whether it's ZWJ, ZWNJ, or something else.
  * - For Ws: index of which space character this is, if space fallback
  *   is needed, ie. we don't set this by default, only if asked to.
- *
- * If needed, we can use the ZWJ/ZWNJ to use the high byte as well,
- * freeing two more bits.
  */
 
 enum hb_unicode_props_flags_t {
-  UPROPS_MASK_ZWJ       = 0x20u,
-  UPROPS_MASK_ZWNJ      = 0x40u,
-  UPROPS_MASK_IGNORABLE = 0x80u,
-  UPROPS_MASK_GEN_CAT   = 0x1Fu
+  UPROPS_MASK_GEN_CAT	= 0x001Fu,
+  UPROPS_MASK_IGNORABLE	= 0x0020u,
+  UPROPS_MASK_FVS	= 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3 */
+
+  /* If GEN_CAT=FORMAT, top byte masks: */
+  UPROPS_MASK_Cf_ZWJ	= 0x0100u,
+  UPROPS_MASK_Cf_ZWNJ	= 0x0200u
 };
 HB_MARK_AS_FLAG_T (hb_unicode_props_flags_t);
 
 static inline void
 _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
 {
   hb_unicode_funcs_t *unicode = buffer->unicode;
   unsigned int u = info->codepoint;
@@ -248,18 +249,27 @@ static inline void
 
   if (u >= 0x80)
   {
     buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
     if (unlikely (unicode->is_default_ignorable (u)))
     {
       buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
       props |=  UPROPS_MASK_IGNORABLE;
-      if (u == 0x200Cu) props |= UPROPS_MASK_ZWNJ;
-      if (u == 0x200Du) props |= UPROPS_MASK_ZWJ;
+      if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
+      if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
+      /* Mongolian Free Variation Selectors need to be remembered
+       * because although we need to hide them like default-ignorables,
+       * they need to non-ignorable during shaping.  This is similar to
+       * what we do for joiners in Indic-like shapers, but since the
+       * FVSes are GC=Mn, we have use a separate bit to remember them.
+       * Fixes:
+       * https://github.com/behdad/harfbuzz/issues/234
+       */
+      if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_FVS;
     }
     else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat)))
     {
       /* The above check is just an optimization to let in only things we need further
        * processing on. */
 
       /* Only Mn and Mc can have non-zero ccc:
        * http://www.unicode.org/policies/stability_policy.html#Property_Value
@@ -345,41 +355,54 @@ static inline hb_unicode_funcs_t::space_
 	 hb_unicode_funcs_t::NOT_SPACE;
 }
 
 static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info);
 
 static inline hb_bool_t
 _hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
 {
-  return (info->unicode_props() & UPROPS_MASK_IGNORABLE) && !_hb_glyph_info_ligated (info);
+  return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
+	 !_hb_glyph_info_ligated (info);
+}
+static inline hb_bool_t
+_hb_glyph_info_is_default_ignorable_and_not_fvs (const hb_glyph_info_t *info)
+{
+  return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_FVS))
+	  == UPROPS_MASK_IGNORABLE) &&
+	 !_hb_glyph_info_ligated (info);
 }
 
+static inline bool
+_hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_get_general_category (info) ==
+	 HB_UNICODE_GENERAL_CATEGORY_FORMAT;
+}
 static inline hb_bool_t
 _hb_glyph_info_is_zwnj (const hb_glyph_info_t *info)
 {
-  return !!(info->unicode_props() & UPROPS_MASK_ZWNJ);
+  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWNJ);
 }
-
 static inline hb_bool_t
 _hb_glyph_info_is_zwj (const hb_glyph_info_t *info)
 {
-  return !!(info->unicode_props() & UPROPS_MASK_ZWJ);
+  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
 }
-
 static inline hb_bool_t
 _hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
 {
-  return !!(info->unicode_props() & (UPROPS_MASK_ZWNJ | UPROPS_MASK_ZWJ));
+  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ));
 }
-
 static inline void
 _hb_glyph_info_flip_joiners (hb_glyph_info_t *info)
 {
-  info->unicode_props() ^= UPROPS_MASK_ZWNJ | UPROPS_MASK_ZWJ;
+  if (!_hb_glyph_info_is_unicode_format (info))
+    return;
+  info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ;
 }
 
 /* lig_props: aka lig_id / lig_comp
  *
  * When a ligature is formed:
  *
  *   - The ligature glyph and any marks in between all the same newly allocated
  *     lig_id,
--- a/gfx/harfbuzz/src/hb-ot-layout.cc
+++ b/gfx/harfbuzz/src/hb-ot-layout.cc
@@ -65,33 +65,78 @@ hb_ot_layout_t *
      * The ugly business of blacklisting individual fonts' tables happen here!
      * See this thread for why we finally had to bend in and do this:
      * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
      */
     unsigned int gdef_len = hb_blob_get_length (layout->gdef_blob);
     unsigned int gsub_len = hb_blob_get_length (layout->gsub_blob);
     unsigned int gpos_len = hb_blob_get_length (layout->gpos_blob);
     if (0
-      || (442 == gdef_len && 42038 == gpos_len && 2874 == gsub_len) /* Windows 7 timesi.ttf */
-      || (430 == gdef_len && 40662 == gpos_len && 2874 == gsub_len) /* Windows 7 timesbi.ttf */
-      || (442 == gdef_len && 39116 == gpos_len && 2874 == gsub_len) /* Windows ??? timesi.ttf */
-      || (430 == gdef_len && 39374 == gpos_len && 2874 == gsub_len) /* Windows ??? timesbi.ttf */
-      || (490 == gdef_len && 41638 == gpos_len && 3046 == gsub_len) /* OS X 10.11.3 Times New Roman Italic.ttf */
-      || (478 == gdef_len && 41902 == gpos_len && 3046 == gsub_len) /* OS X 10.11.3 Times New Roman Bold Italic.ttf */
+      /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
+      || (442 == gdef_len && 42038 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
+      || (430 == gdef_len && 40662 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
+      || (442 == gdef_len && 39116 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
+      || (430 == gdef_len && 39374 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
+      || (490 == gdef_len && 41638 == gpos_len && 3046 == gsub_len)
+      /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
+      || (478 == gdef_len && 41902 == gpos_len && 3046 == gsub_len)
     )
     {
       /* In certain versions of Times New Roman Italic and Bold Italic,
        * ASCII double quotation mark U+0022, mapped to glyph 5, has wrong
        * glyph class 3 (mark) in GDEF.  Nuke the GDEF to avoid zero-width
        * double-quote.  See:
        * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
        */
      if (3 == layout->gdef->get_glyph_class (5))
        layout->gdef = &OT::Null(OT::GDEF);
     }
+    else if (0
+      /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c  tahoma.ttf from Windows 8 */
+      || (898 == gdef_len && 46470 == gpos_len && 12554 == gsub_len)
+      /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc  tahomabd.ttf from Windows 8 */
+      || (910 == gdef_len && 47732 == gpos_len && 12566 == gsub_len)
+      /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e  tahoma.ttf from Windows 8.1 */
+      || (928 == gdef_len && 59332 == gpos_len && 23298 == gsub_len)
+      /* sha1sum:6d400781948517c3c0441ba42acb309584b73033  tahomabd.ttf from Windows 8.1 */
+      || (940 == gdef_len && 60732 == gpos_len && 23310 == gsub_len)
+      /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846  tahoma.ttf from Windows 10 */
+      || (994 == gdef_len && 60336 == gpos_len && 24474 == gsub_len)
+      /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343  tahomabd.ttf from Windows 10 */
+      || (1006 == gdef_len && 61740 == gpos_len && 24470 == gsub_len)
+      /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7  Tahoma.ttf from Mac OS X 10.9 */
+      || (832 == gdef_len && 47162 == gpos_len && 7324 == gsub_len)
+      /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba  Tahoma Bold.ttf from Mac OS X 10.9 */
+      || (844 == gdef_len && 45474 == gpos_len && 7302 == gsub_len)
+      /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0  himalaya.ttf from Windows 8 */
+      || (192 == gdef_len && 7254 == gpos_len && 12638 == gsub_len)
+      /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427  himalaya.ttf from Windows 8.1 */
+      || (192 == gdef_len && 7254 == gpos_len && 12690 == gsub_len)
+      /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44  cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */
+      /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371  cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */
+      || (188 == gdef_len && 3852 == gpos_len && 248 == gsub_len)
+      /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f  cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */
+      /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b  cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */
+      || (188 == gdef_len && 3426 == gpos_len && 264 == gsub_len)
+    )
+    {
+      /* Many versions of Tahoma have bad GDEF tables that incorrectly classify some spacing marks
+       * such as certain IPA symbols as glyph class 3. So do older versions of Microsoft Himalaya,
+       * and the version of Cantarell shipped by Ubuntu 16.04.
+       * Nuke the GDEF tables of these fonts to avoid unwanted width-zeroing.
+       * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925
+       *     https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
+       *     https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
+       */
+      layout->gdef = &OT::Null(OT::GDEF);
+    }
   }
 
   layout->gsub_lookup_count = layout->gsub->get_lookup_count ();
   layout->gpos_lookup_count = layout->gpos->get_lookup_count ();
 
   layout->gsub_accels = (hb_ot_layout_lookup_accelerator_t *) calloc (layout->gsub->get_lookup_count (), sizeof (hb_ot_layout_lookup_accelerator_t));
   layout->gpos_accels = (hb_ot_layout_lookup_accelerator_t *) calloc (layout->gpos->get_lookup_count (), sizeof (hb_ot_layout_lookup_accelerator_t));
 
--- a/gfx/harfbuzz/src/hb-ot-map.cc
+++ b/gfx/harfbuzz/src/hb-ot-map.cc
@@ -188,17 +188,18 @@ hb_ot_map_builder_t::compile (hb_ot_map_
     const feature_info_t *info = &feature_infos[i];
 
     unsigned int bits_needed;
 
     if ((info->flags & F_GLOBAL) && info->max_value == 1)
       /* Uses the global bit */
       bits_needed = 0;
     else
-      bits_needed = _hb_bit_storage (info->max_value);
+      /* Limit to 8 bits per feature. */
+      bits_needed = MIN(8u, _hb_bit_storage (info->max_value));
 
     if (!info->max_value || next_bit + bits_needed > 8 * sizeof (hb_mask_t))
       continue; /* Feature disabled, or not enough bits. */
 
 
     hb_bool_t found = false;
     unsigned int feature_index[2];
     for (unsigned int table_index = 0; table_index < 2; table_index++)
@@ -238,21 +239,21 @@ hb_ot_map_builder_t::compile (hb_ot_map_
     map->stage[1] = info->stage[1];
     map->auto_zwj = !(info->flags & F_MANUAL_ZWJ);
     if ((info->flags & F_GLOBAL) && info->max_value == 1) {
       /* Uses the global bit */
       map->shift = 0;
       map->mask = 1;
     } else {
       map->shift = next_bit;
-      map->mask = (1 << (next_bit + bits_needed)) - (1 << next_bit);
+      map->mask = (1u << (next_bit + bits_needed)) - (1u << next_bit);
       next_bit += bits_needed;
       m.global_mask |= (info->default_value << map->shift) & map->mask;
     }
-    map->_1_mask = (1 << map->shift) & map->mask;
+    map->_1_mask = (1u << map->shift) & map->mask;
     map->needs_fallback = !found;
 
   }
   feature_infos.shrink (0); /* Done with these */
 
 
   add_gsub_pause (NULL);
   add_gpos_pause (NULL);
new file mode 100644
--- /dev/null
+++ b/gfx/harfbuzz/src/hb-ot-post-table.hh
@@ -0,0 +1,119 @@
+/*
+ * Copyright © 2016  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_POST_TABLE_HH
+#define HB_OT_POST_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+
+namespace OT {
+
+
+/*
+ * post -- PostScript
+ */
+
+#define HB_OT_TAG_post HB_TAG('p','o','s','t')
+
+
+struct postV2Tail
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (numberOfGlyphs.sanitize (c) &&
+		  c->check_array (glyphNameIndex, sizeof (USHORT), numberOfGlyphs));
+  }
+
+  USHORT	numberOfGlyphs;		/* Number of glyphs (this should be the
+					 * same as numGlyphs in 'maxp' table). */
+  USHORT	glyphNameIndex[VAR];	/* This is not an offset, but is the
+					 * ordinal number of the glyph in 'post'
+					 * string tables. */
+  BYTE		namesX[VAR];		/* Glyph names with length bytes [variable]
+					 * (a Pascal string). */
+
+  DEFINE_SIZE_ARRAY2 (2, glyphNameIndex, namesX);
+};
+
+struct post
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_post;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (this)))
+      return_trace (false);
+    if (version.to_int () == 0x00020000)
+    {
+      const postV2Tail &v2 = StructAfter<postV2Tail>(*this);
+      return_trace (v2.sanitize (c));
+    }
+    return_trace (true);
+  }
+
+  public:
+  FixedVersion<>version;		/* 0x00010000 for version 1.0
+					 * 0x00020000 for version 2.0
+					 * 0x00025000 for version 2.5 (deprecated)
+					 * 0x00030000 for version 3.0 */
+  Fixed		italicAngle;		/* Italic angle in counter-clockwise degrees
+					 * from the vertical. Zero for upright text,
+					 * negative for text that leans to the right
+					 * (forward). */
+  FWORD		underlinePosition;	/* This is the suggested distance of the top
+					 * of the underline from the baseline
+					 * (negative values indicate below baseline).
+					 * The PostScript definition of this FontInfo
+					 * dictionary key (the y coordinate of the
+					 * center of the stroke) is not used for
+					 * historical reasons. The value of the
+					 * PostScript key may be calculated by
+					 * subtracting half the underlineThickness
+					 * from the value of this field. */
+  FWORD		underlineThickness;	/* Suggested values for the underline
+					   thickness. */
+  ULONG		isFixedPitch;		/* Set to 0 if the font is proportionally
+					 * spaced, non-zero if the font is not
+					 * proportionally spaced (i.e. monospaced). */
+  ULONG		minMemType42;		/* Minimum memory usage when an OpenType font
+					 * is downloaded. */
+  ULONG		maxMemType42;		/* Maximum memory usage when an OpenType font
+					 * is downloaded. */
+  ULONG		minMemType1;		/* Minimum memory usage when an OpenType font
+					 * is downloaded as a Type 1 font. */
+  ULONG		maxMemType1;		/* Maximum memory usage when an OpenType font
+					 * is downloaded as a Type 1 font. */
+/*postV2Tail	v2[VAR];*/
+  DEFINE_SIZE_STATIC (32);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_POST_TABLE_HH */
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-arabic-table.hh
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-arabic-table.hh
@@ -1,29 +1,30 @@
 /* == Start of generated table == */
 /*
  * The following table is generated by running:
  *
  *   ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
  *
  * on files with these headers:
  *
- * # ArabicShaping-8.0.0.txt
- * # Date: 2015-02-17, 23:33:00 GMT [RP]
- * # Blocks-8.0.0.txt
- * # Date: 2014-11-10, 23:04:00 GMT [KW]
+ * # ArabicShaping-9.0.0.txt
+ * # Date: 2016-02-24, 22:25:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
  * UnicodeData.txt does not have a header.
  */
 
 #ifndef HB_OT_SHAPE_COMPLEX_ARABIC_TABLE_HH
 #define HB_OT_SHAPE_COMPLEX_ARABIC_TABLE_HH
 
 
 #define X	JOINING_TYPE_X
 #define R	JOINING_TYPE_R
+#define T	JOINING_TYPE_T
 #define U	JOINING_TYPE_U
 #define A	JOINING_GROUP_ALAPH
 #define DR	JOINING_GROUP_DALATH_RISH
 #define L	JOINING_TYPE_L
 #define C	JOINING_TYPE_C
 #define D	JOINING_TYPE_D
 
 static const uint8_t joining_table[] =
@@ -71,100 +72,111 @@ static const uint8_t joining_table[] =
   /* Mandaic */
 
   /* 0840 */ R,D,D,D,D,D,R,R,D,R,D,D,D,D,D,D,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 */
 
-  /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,
+  /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,X,D,D,D,R,D,D,D,D,X,X,
+  /* 08C0 */ 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,
+  /* 08E0 */ X,X,U,
 
-#define joining_offset_0x1806u 693
+#define joining_offset_0x1806u 739
 
   /* Mongolian */
 
   /* 1800 */             U,D,X,X,C,X,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
   /* 1820 */ 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,
   /* 1840 */ 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,
   /* 1860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,
-  /* 1880 */ U,U,U,U,U,U,U,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,
+  /* 1880 */ U,U,U,U,U,T,T,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,
   /* 18A0 */ D,D,D,D,D,D,D,D,D,X,D,
 
-#define joining_offset_0x200cu 858
+#define joining_offset_0x200cu 904
 
   /* General Punctuation */
 
-  /* 2000 */                         U,C,
-
-#define joining_offset_0x2066u 860
+  /* 2000 */                         U,C,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 2020 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 2040 */ 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,
+  /* 2060 */ X,X,X,X,X,X,U,U,U,U,
 
-  /* General Punctuation */
-
-  /* 2060 */             U,U,U,U,
-
-#define joining_offset_0xa840u 864
+#define joining_offset_0xa840u 998
 
   /* Phags-pa */
 
   /* A840 */ 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,
   /* A860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,L,U,
 
-#define joining_offset_0x10ac0u 916
+#define joining_offset_0x10ac0u 1050
 
   /* Manichaean */
 
   /* 10AC0 */ D,D,D,D,D,R,U,R,U,R,R,U,U,L,R,R,R,R,R,D,D,D,D,L,D,D,D,D,D,R,D,D,
   /* 10AE0 */ D,R,U,U,R,X,X,X,X,X,X,D,D,D,D,R,
 
-#define joining_offset_0x10b80u 964
+#define joining_offset_0x10b80u 1098
 
   /* Psalter Pahlavi */
 
   /* 10B80 */ D,R,D,R,R,R,D,D,D,R,D,D,R,D,R,R,D,R,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
   /* 10BA0 */ X,X,X,X,X,X,X,X,X,R,R,R,R,D,D,U,
 
-}; /* Table items: 1012; occupancy: 57% */
+#define joining_offset_0x1e900u 1146
+
+  /* Adlam */
+
+  /* 1E900 */ 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,
+  /* 1E920 */ 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,
+  /* 1E940 */ D,D,D,D,
+
+}; /* Table items: 1214; occupancy: 54% */
 
 
 static unsigned int
 joining_type (hb_codepoint_t u)
 {
   switch (u >> 12)
   {
     case 0x0u:
-      if (hb_in_range (u, 0x0600u, 0x08B4u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
+      if (hb_in_range (u, 0x0600u, 0x08E2u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
       break;
 
     case 0x1u:
       if (hb_in_range (u, 0x1806u, 0x18AAu)) return joining_table[u - 0x1806u + joining_offset_0x1806u];
       break;
 
     case 0x2u:
-      if (hb_in_range (u, 0x200Cu, 0x200Du)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
-      if (hb_in_range (u, 0x2066u, 0x2069u)) return joining_table[u - 0x2066u + joining_offset_0x2066u];
+      if (hb_in_range (u, 0x200Cu, 0x2069u)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
       break;
 
     case 0xAu:
       if (hb_in_range (u, 0xA840u, 0xA873u)) return joining_table[u - 0xA840u + joining_offset_0xa840u];
       break;
 
     case 0x10u:
       if (hb_in_range (u, 0x10AC0u, 0x10AEFu)) return joining_table[u - 0x10AC0u + joining_offset_0x10ac0u];
       if (hb_in_range (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u];
       break;
 
+    case 0x1Eu:
+      if (hb_in_range (u, 0x1E900u, 0x1E943u)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u];
+      break;
+
     default:
       break;
   }
   return X;
 }
 
 #undef X
 #undef R
+#undef T
 #undef U
 #undef A
 #undef DR
 #undef L
 #undef C
 #undef D
 
 
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-indic-machine.hh
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-indic-machine.hh
@@ -51,62 +51,62 @@ static const unsigned char _indic_syllab
 	8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
 	5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 
 	4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
 	16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 
 	4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 5u, 8u, 4u, 14u, 4u, 14u, 5u, 8u, 
 	5u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
 	5u, 7u, 7u, 7u, 8u, 8u, 1u, 16u, 8u, 13u, 4u, 8u, 6u, 6u, 16u, 16u, 
 	4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
-	16u, 16u, 8u, 8u, 1u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
-	3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
-	3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 
-	5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 
-	3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-	3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 
-	5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 3u, 31u, 3u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
-	3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
-	3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 
+	16u, 16u, 8u, 8u, 1u, 18u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 
+	3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 
+	3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 
 	5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 
 	3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
 	3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 
-	5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	4u, 14u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 
-	4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 
-	4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 5u, 10u, 
+	5u, 14u, 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 
+	1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 
+	4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 
+	4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 
 	9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 
 	5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 
 	4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-	3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	4u, 14u, 3u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
-	3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
-	3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 
-	5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 
-	3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
+	3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u, 
+	3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
+	3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
+	3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 
+	9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 
+	3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
+	3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u, 
+	4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
+	3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 
+	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 17u, 4u, 14u, 
+	3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
+	3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
+	3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 
+	9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 
+	3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
+	3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u, 
+	4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
+	3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
+	3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 
+	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u, 
+	1u, 17u, 4u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 
+	5u, 10u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 3u, 17u, 3u, 17u, 1u, 16u, 
 	3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 
-	5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 3u, 31u, 1u, 31u, 3u, 31u, 1u, 31u, 4u, 14u, 5u, 10u, 9u, 10u, 
-	9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 1u, 16u, 3u, 31u, 3u, 31u, 
-	4u, 31u, 3u, 31u, 3u, 31u, 1u, 16u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 
-	4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-	3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 
-	5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 0
+	5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 
+	3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 
+	9u, 10u, 9u, 9u, 5u, 10u, 0
 };
 
 static const char _indic_syllable_machine_key_spans[] = {
 	1, 16, 6, 4, 3, 1, 4, 3, 
 	1, 4, 3, 1, 4, 3, 1, 5, 
 	1, 1, 5, 1, 1, 5, 1, 1, 
 	5, 1, 1, 11, 11, 11, 11, 11, 
 	11, 11, 11, 11, 11, 1, 16, 6, 
@@ -122,62 +122,62 @@ static const char _indic_syllable_machin
 	6, 4, 3, 1, 4, 3, 1, 4, 
 	3, 1, 4, 3, 1, 5, 1, 1, 
 	5, 1, 1, 5, 1, 1, 5, 1, 
 	1, 11, 11, 11, 11, 11, 11, 11, 
 	11, 11, 11, 11, 4, 11, 11, 4, 
 	3, 4, 3, 1, 4, 3, 1, 4, 
 	3, 1, 1, 16, 6, 5, 1, 1, 
 	5, 1, 1, 5, 1, 1, 5, 1, 
-	1, 1, 31, 29, 29, 28, 16, 29, 
-	29, 28, 16, 29, 29, 28, 16, 29, 
-	29, 28, 16, 29, 29, 28, 10, 10, 
-	6, 2, 1, 2, 2, 1, 6, 11, 
-	8, 6, 8, 11, 12, 12, 11, 10, 
-	12, 11, 10, 12, 11, 10, 12, 11, 
-	10, 12, 16, 28, 11, 29, 29, 16, 
-	16, 16, 16, 16, 29, 29, 16, 16, 
-	16, 16, 16, 29, 29, 16, 16, 16, 
-	16, 16, 29, 29, 16, 16, 16, 16, 
-	16, 29, 29, 29, 29, 28, 16, 29, 
-	29, 28, 16, 29, 29, 28, 16, 29, 
-	29, 28, 16, 29, 29, 28, 10, 10, 
+	1, 1, 18, 15, 15, 14, 16, 15, 
+	15, 14, 16, 15, 15, 14, 16, 15, 
+	15, 14, 16, 15, 15, 14, 10, 10, 
 	6, 2, 1, 2, 2, 1, 6, 11, 
 	8, 6, 8, 11, 12, 12, 11, 10, 
 	12, 11, 10, 12, 11, 10, 12, 11, 
-	10, 12, 16, 28, 11, 29, 29, 16, 
-	16, 16, 16, 16, 29, 29, 16, 16, 
-	16, 16, 16, 29, 29, 16, 16, 16, 
-	16, 16, 29, 29, 16, 16, 16, 16, 
-	11, 16, 29, 29, 28, 16, 29, 29, 
-	28, 16, 29, 29, 28, 16, 29, 29, 
-	28, 16, 29, 29, 28, 10, 10, 6, 
+	10, 12, 16, 11, 15, 15, 16, 16, 
+	16, 16, 16, 15, 15, 16, 16, 16, 
+	16, 16, 15, 15, 16, 16, 16, 16, 
+	16, 15, 15, 16, 16, 16, 16, 16, 
+	15, 15, 15, 15, 14, 16, 15, 15, 
+	14, 16, 15, 15, 14, 16, 15, 15, 
+	14, 16, 15, 15, 14, 10, 10, 6, 
 	2, 1, 2, 2, 1, 6, 11, 8, 
 	6, 8, 11, 12, 12, 11, 10, 12, 
 	11, 10, 12, 11, 10, 12, 11, 10, 
-	12, 16, 28, 11, 29, 29, 16, 16, 
-	16, 16, 16, 29, 29, 16, 16, 16, 
-	16, 16, 29, 29, 16, 16, 16, 16, 
-	16, 29, 29, 16, 16, 16, 16, 16, 
-	11, 29, 11, 29, 29, 28, 16, 29, 
-	29, 28, 16, 29, 29, 28, 16, 29, 
-	29, 28, 16, 29, 29, 28, 10, 10, 
-	6, 2, 1, 2, 2, 1, 6, 11, 
-	8, 6, 8, 11, 12, 12, 11, 10, 
+	12, 16, 11, 15, 15, 16, 16, 16, 
+	16, 16, 15, 15, 16, 16, 16, 16, 
+	16, 15, 15, 16, 16, 16, 16, 16, 
+	15, 15, 16, 16, 16, 16, 11, 16, 
+	15, 15, 14, 16, 15, 15, 14, 16, 
+	15, 15, 14, 16, 15, 15, 14, 16, 
+	15, 15, 14, 10, 10, 6, 2, 1, 
+	2, 2, 1, 6, 11, 8, 6, 8, 
+	11, 12, 12, 11, 10, 12, 11, 10, 
+	12, 11, 10, 12, 11, 10, 12, 16, 
+	11, 15, 15, 16, 16, 16, 16, 16, 
+	15, 15, 16, 16, 16, 16, 16, 15, 
+	15, 16, 16, 16, 16, 16, 15, 15, 
+	16, 16, 16, 16, 16, 11, 15, 11, 
+	15, 15, 14, 16, 15, 15, 14, 16, 
+	15, 15, 14, 16, 15, 15, 14, 16, 
+	15, 15, 14, 10, 10, 6, 2, 1, 
+	2, 2, 1, 6, 11, 8, 6, 8, 
+	11, 12, 12, 11, 10, 12, 11, 10, 
+	12, 11, 10, 12, 11, 10, 12, 16, 
+	11, 15, 15, 16, 16, 16, 16, 16, 
+	15, 15, 16, 16, 16, 16, 16, 15, 
+	15, 16, 16, 16, 16, 16, 15, 15, 
+	16, 16, 16, 16, 16, 15, 17, 15, 
+	17, 11, 6, 2, 1, 2, 2, 1, 
+	6, 16, 15, 15, 14, 15, 15, 16, 
 	12, 11, 10, 12, 11, 10, 12, 11, 
-	10, 12, 16, 28, 11, 29, 29, 16, 
-	16, 16, 16, 16, 29, 29, 16, 16, 
-	16, 16, 16, 29, 29, 16, 16, 16, 
-	16, 16, 29, 29, 16, 16, 16, 16, 
-	16, 29, 31, 29, 31, 11, 6, 2, 
-	1, 2, 2, 1, 6, 16, 29, 29, 
-	28, 29, 29, 16, 12, 11, 10, 12, 
-	11, 10, 12, 11, 10, 12, 11, 10, 
-	11, 8, 6, 8, 11, 16, 8, 6, 
-	6, 2, 1, 2, 2, 1, 6
+	10, 12, 11, 10, 11, 8, 6, 8, 
+	11, 16, 8, 6, 6, 2, 1, 2, 
+	2, 1, 6
 };
 
 static const short _indic_syllable_machine_index_offsets[] = {
 	0, 2, 19, 26, 31, 35, 37, 42, 
 	46, 48, 53, 57, 59, 64, 68, 70, 
 	76, 78, 80, 86, 88, 90, 96, 98, 
 	100, 106, 108, 110, 122, 134, 146, 158, 
 	170, 182, 194, 206, 218, 230, 232, 249, 
@@ -193,62 +193,62 @@ static const short _indic_syllable_machi
 	697, 704, 709, 713, 715, 720, 724, 726, 
 	731, 735, 737, 742, 746, 748, 754, 756, 
 	758, 764, 766, 768, 774, 776, 778, 784, 
 	786, 788, 800, 812, 824, 836, 848, 860, 
 	872, 884, 896, 908, 920, 925, 937, 949, 
 	954, 958, 963, 967, 969, 974, 978, 980, 
 	985, 989, 991, 993, 1010, 1017, 1023, 1025, 
 	1027, 1033, 1035, 1037, 1043, 1045, 1047, 1053, 
-	1055, 1057, 1059, 1091, 1121, 1151, 1180, 1197, 
-	1227, 1257, 1286, 1303, 1333, 1363, 1392, 1409, 
-	1439, 1469, 1498, 1515, 1545, 1575, 1604, 1615, 
-	1626, 1633, 1636, 1638, 1641, 1644, 1646, 1653, 
-	1665, 1674, 1681, 1690, 1702, 1715, 1728, 1740, 
-	1751, 1764, 1776, 1787, 1800, 1812, 1823, 1836, 
-	1848, 1859, 1872, 1889, 1918, 1930, 1960, 1990, 
-	2007, 2024, 2041, 2058, 2075, 2105, 2135, 2152, 
-	2169, 2186, 2203, 2220, 2250, 2280, 2297, 2314, 
-	2331, 2348, 2365, 2395, 2425, 2442, 2459, 2476, 
-	2493, 2510, 2540, 2570, 2600, 2630, 2659, 2676, 
-	2706, 2736, 2765, 2782, 2812, 2842, 2871, 2888, 
-	2918, 2948, 2977, 2994, 3024, 3054, 3083, 3094, 
-	3105, 3112, 3115, 3117, 3120, 3123, 3125, 3132, 
-	3144, 3153, 3160, 3169, 3181, 3194, 3207, 3219, 
-	3230, 3243, 3255, 3266, 3279, 3291, 3302, 3315, 
-	3327, 3338, 3351, 3368, 3397, 3409, 3439, 3469, 
-	3486, 3503, 3520, 3537, 3554, 3584, 3614, 3631, 
-	3648, 3665, 3682, 3699, 3729, 3759, 3776, 3793, 
-	3810, 3827, 3844, 3874, 3904, 3921, 3938, 3955, 
-	3972, 3984, 4001, 4031, 4061, 4090, 4107, 4137, 
-	4167, 4196, 4213, 4243, 4273, 4302, 4319, 4349, 
-	4379, 4408, 4425, 4455, 4485, 4514, 4525, 4536, 
-	4543, 4546, 4548, 4551, 4554, 4556, 4563, 4575, 
-	4584, 4591, 4600, 4612, 4625, 4638, 4650, 4661, 
-	4674, 4686, 4697, 4710, 4722, 4733, 4746, 4758, 
-	4769, 4782, 4799, 4828, 4840, 4870, 4900, 4917, 
-	4934, 4951, 4968, 4985, 5015, 5045, 5062, 5079, 
-	5096, 5113, 5130, 5160, 5190, 5207, 5224, 5241, 
-	5258, 5275, 5305, 5335, 5352, 5369, 5386, 5403, 
-	5420, 5432, 5462, 5474, 5504, 5534, 5563, 5580, 
-	5610, 5640, 5669, 5686, 5716, 5746, 5775, 5792, 
-	5822, 5852, 5881, 5898, 5928, 5958, 5987, 5998, 
-	6009, 6016, 6019, 6021, 6024, 6027, 6029, 6036, 
-	6048, 6057, 6064, 6073, 6085, 6098, 6111, 6123, 
-	6134, 6147, 6159, 6170, 6183, 6195, 6206, 6219, 
-	6231, 6242, 6255, 6272, 6301, 6313, 6343, 6373, 
-	6390, 6407, 6424, 6441, 6458, 6488, 6518, 6535, 
-	6552, 6569, 6586, 6603, 6633, 6663, 6680, 6697, 
-	6714, 6731, 6748, 6778, 6808, 6825, 6842, 6859, 
-	6876, 6893, 6923, 6955, 6985, 7017, 7029, 7036, 
-	7039, 7041, 7044, 7047, 7049, 7056, 7073, 7103, 
-	7133, 7162, 7192, 7222, 7239, 7252, 7264, 7275, 
-	7288, 7300, 7311, 7324, 7336, 7347, 7360, 7372, 
-	7383, 7395, 7404, 7411, 7420, 7432, 7449, 7458, 
-	7465, 7472, 7475, 7477, 7480, 7483, 7485
+	1055, 1057, 1059, 1078, 1094, 1110, 1125, 1142, 
+	1158, 1174, 1189, 1206, 1222, 1238, 1253, 1270, 
+	1286, 1302, 1317, 1334, 1350, 1366, 1381, 1392, 
+	1403, 1410, 1413, 1415, 1418, 1421, 1423, 1430, 
+	1442, 1451, 1458, 1467, 1479, 1492, 1505, 1517, 
+	1528, 1541, 1553, 1564, 1577, 1589, 1600, 1613, 
+	1625, 1636, 1649, 1666, 1678, 1694, 1710, 1727, 
+	1744, 1761, 1778, 1795, 1811, 1827, 1844, 1861, 
+	1878, 1895, 1912, 1928, 1944, 1961, 1978, 1995, 
+	2012, 2029, 2045, 2061, 2078, 2095, 2112, 2129, 
+	2146, 2162, 2178, 2194, 2210, 2225, 2242, 2258, 
+	2274, 2289, 2306, 2322, 2338, 2353, 2370, 2386, 
+	2402, 2417, 2434, 2450, 2466, 2481, 2492, 2503, 
+	2510, 2513, 2515, 2518, 2521, 2523, 2530, 2542, 
+	2551, 2558, 2567, 2579, 2592, 2605, 2617, 2628, 
+	2641, 2653, 2664, 2677, 2689, 2700, 2713, 2725, 
+	2736, 2749, 2766, 2778, 2794, 2810, 2827, 2844, 
+	2861, 2878, 2895, 2911, 2927, 2944, 2961, 2978, 
+	2995, 3012, 3028, 3044, 3061, 3078, 3095, 3112, 
+	3129, 3145, 3161, 3178, 3195, 3212, 3229, 3241, 
+	3258, 3274, 3290, 3305, 3322, 3338, 3354, 3369, 
+	3386, 3402, 3418, 3433, 3450, 3466, 3482, 3497, 
+	3514, 3530, 3546, 3561, 3572, 3583, 3590, 3593, 
+	3595, 3598, 3601, 3603, 3610, 3622, 3631, 3638, 
+	3647, 3659, 3672, 3685, 3697, 3708, 3721, 3733, 
+	3744, 3757, 3769, 3780, 3793, 3805, 3816, 3829, 
+	3846, 3858, 3874, 3890, 3907, 3924, 3941, 3958, 
+	3975, 3991, 4007, 4024, 4041, 4058, 4075, 4092, 
+	4108, 4124, 4141, 4158, 4175, 4192, 4209, 4225, 
+	4241, 4258, 4275, 4292, 4309, 4326, 4338, 4354, 
+	4366, 4382, 4398, 4413, 4430, 4446, 4462, 4477, 
+	4494, 4510, 4526, 4541, 4558, 4574, 4590, 4605, 
+	4622, 4638, 4654, 4669, 4680, 4691, 4698, 4701, 
+	4703, 4706, 4709, 4711, 4718, 4730, 4739, 4746, 
+	4755, 4767, 4780, 4793, 4805, 4816, 4829, 4841, 
+	4852, 4865, 4877, 4888, 4901, 4913, 4924, 4937, 
+	4954, 4966, 4982, 4998, 5015, 5032, 5049, 5066, 
+	5083, 5099, 5115, 5132, 5149, 5166, 5183, 5200, 
+	5216, 5232, 5249, 5266, 5283, 5300, 5317, 5333, 
+	5349, 5366, 5383, 5400, 5417, 5434, 5450, 5468, 
+	5484, 5502, 5514, 5521, 5524, 5526, 5529, 5532, 
+	5534, 5541, 5558, 5574, 5590, 5605, 5621, 5637, 
+	5654, 5667, 5679, 5690, 5703, 5715, 5726, 5739, 
+	5751, 5762, 5775, 5787, 5798, 5810, 5819, 5826, 
+	5835, 5847, 5864, 5873, 5880, 5887, 5890, 5892, 
+	5895, 5898, 5900
 };
 
 static const short _indic_syllable_machine_indicies[] = {
 	1, 0, 2, 3, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 2, 0, 1, 0, 0, 0, 0, 
 	4, 0, 5, 5, 6, 1, 0, 7, 
 	7, 6, 0, 6, 0, 8, 8, 9, 
@@ -376,892 +376,694 @@ static const short _indic_syllable_machi
 	170, 0, 157, 0, 0, 0, 0, 172, 
 	0, 173, 0, 0, 0, 157, 0, 174, 
 	0, 175, 0, 176, 167, 167, 168, 157, 
 	0, 177, 0, 178, 0, 179, 164, 164, 
 	165, 157, 0, 180, 0, 181, 0, 182, 
 	161, 161, 162, 157, 0, 183, 0, 184, 
 	0, 186, 185, 188, 189, 190, 191, 192, 
 	193, 84, 79, 194, 195, 196, 196, 156, 
-	197, 198, 199, 200, 201, 187, 187, 187, 
-	187, 187, 187, 187, 187, 187, 187, 187, 
-	187, 202, 187, 204, 205, 206, 207, 6, 
-	1, 208, 209, 203, 203, 38, 210, 203, 
-	203, 211, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 212, 
-	203, 213, 205, 214, 214, 6, 1, 208, 
-	209, 203, 203, 203, 210, 203, 203, 211, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 212, 203, 205, 
-	214, 214, 6, 1, 208, 209, 203, 203, 
-	203, 210, 203, 203, 211, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 212, 203, 215, 203, 203, 203, 
-	19, 216, 203, 1, 208, 209, 203, 203, 
-	203, 217, 203, 215, 203, 218, 219, 220, 
-	221, 6, 1, 208, 209, 203, 203, 36, 
-	222, 203, 203, 211, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 212, 203, 223, 219, 224, 224, 6, 
-	1, 208, 209, 203, 203, 203, 222, 203, 
-	203, 211, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 212, 
-	203, 219, 224, 224, 6, 1, 208, 209, 
-	203, 203, 203, 222, 203, 203, 211, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 212, 203, 225, 203, 
-	203, 203, 19, 226, 203, 1, 208, 209, 
-	203, 203, 203, 217, 203, 225, 203, 227, 
-	228, 229, 230, 6, 1, 208, 209, 203, 
-	203, 34, 231, 203, 203, 211, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 212, 203, 232, 228, 233, 
-	233, 6, 1, 208, 209, 203, 203, 203, 
-	231, 203, 203, 211, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 212, 203, 228, 233, 233, 6, 1, 
-	208, 209, 203, 203, 203, 231, 203, 203, 
-	211, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 212, 203, 
-	234, 203, 203, 203, 19, 235, 203, 1, 
-	208, 209, 203, 203, 203, 217, 203, 234, 
-	203, 236, 237, 238, 239, 6, 1, 208, 
-	209, 203, 203, 32, 240, 203, 203, 211, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 212, 203, 241, 
-	237, 242, 242, 6, 1, 208, 209, 203, 
-	203, 203, 240, 203, 203, 211, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 212, 203, 237, 242, 242, 
-	6, 1, 208, 209, 203, 203, 203, 240, 
-	203, 203, 211, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	212, 203, 243, 203, 203, 203, 19, 244, 
-	203, 1, 208, 209, 203, 203, 203, 217, 
-	203, 243, 203, 245, 246, 247, 248, 6, 
-	1, 208, 209, 203, 203, 30, 249, 203, 
-	203, 211, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 212, 
-	203, 250, 246, 251, 251, 6, 1, 208, 
-	209, 203, 203, 203, 249, 203, 203, 211, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 212, 203, 246, 
-	251, 251, 6, 1, 208, 209, 203, 203, 
-	203, 249, 203, 203, 211, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 212, 203, 19, 252, 203, 1, 
-	208, 209, 203, 203, 203, 217, 203, 253, 
-	253, 203, 1, 208, 209, 203, 203, 203, 
-	217, 203, 254, 203, 203, 255, 208, 209, 
-	203, 208, 209, 203, 256, 203, 208, 257, 
-	203, 208, 258, 203, 208, 203, 254, 203, 
-	203, 203, 208, 209, 203, 259, 203, 260, 
-	261, 203, 1, 208, 209, 203, 203, 4, 
-	203, 3, 203, 253, 253, 203, 1, 208, 
-	209, 203, 253, 253, 203, 1, 208, 209, 
-	203, 259, 203, 253, 253, 203, 1, 208, 
-	209, 203, 259, 203, 260, 253, 203, 1, 
-	208, 209, 203, 203, 4, 203, 19, 203, 
-	262, 262, 6, 1, 208, 209, 203, 203, 
-	203, 217, 203, 263, 28, 264, 265, 9, 
-	1, 208, 209, 203, 203, 203, 217, 203, 
-	28, 264, 265, 9, 1, 208, 209, 203, 
-	203, 203, 217, 203, 264, 264, 9, 1, 
-	208, 209, 203, 203, 203, 217, 203, 266, 
-	25, 267, 268, 12, 1, 208, 209, 203, 
-	203, 203, 217, 203, 25, 267, 268, 12, 
-	1, 208, 209, 203, 203, 203, 217, 203, 
-	267, 267, 12, 1, 208, 209, 203, 203, 
-	203, 217, 203, 269, 22, 270, 271, 15, 
-	1, 208, 209, 203, 203, 203, 217, 203, 
-	22, 270, 271, 15, 1, 208, 209, 203, 
-	203, 203, 217, 203, 270, 270, 15, 1, 
-	208, 209, 203, 203, 203, 217, 203, 272, 
-	19, 253, 273, 203, 1, 208, 209, 203, 
-	203, 203, 217, 203, 19, 253, 273, 203, 
-	1, 208, 209, 203, 203, 203, 217, 203, 
-	253, 274, 203, 1, 208, 209, 203, 203, 
-	203, 217, 203, 19, 203, 253, 253, 203, 
-	1, 208, 209, 203, 203, 203, 217, 203, 
-	2, 3, 203, 203, 19, 252, 203, 1, 
-	208, 209, 203, 203, 203, 217, 203, 2, 
-	203, 246, 251, 251, 6, 1, 208, 209, 
-	203, 203, 203, 249, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 212, 203, 246, 251, 
-	251, 6, 1, 208, 209, 203, 203, 203, 
-	249, 203, 245, 246, 251, 251, 6, 1, 
-	208, 209, 203, 203, 203, 249, 203, 203, 
-	211, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 212, 203, 
-	245, 246, 247, 251, 6, 1, 208, 209, 
-	203, 203, 30, 249, 203, 203, 211, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 212, 203, 243, 203, 
-	275, 203, 262, 262, 6, 1, 208, 209, 
-	203, 203, 203, 217, 203, 243, 203, 243, 
-	203, 203, 203, 253, 253, 203, 1, 208, 
-	209, 203, 203, 203, 217, 203, 243, 203, 
-	243, 203, 203, 203, 253, 276, 203, 1, 
-	208, 209, 203, 203, 203, 217, 203, 243, 
-	203, 243, 203, 275, 203, 253, 253, 203, 
-	1, 208, 209, 203, 203, 203, 217, 203, 
-	243, 203, 243, 3, 203, 203, 19, 244, 
-	203, 1, 208, 209, 203, 203, 203, 217, 
-	203, 243, 203, 236, 237, 242, 242, 6, 
-	1, 208, 209, 203, 203, 203, 240, 203, 
-	203, 211, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 212, 
-	203, 236, 237, 238, 242, 6, 1, 208, 
-	209, 203, 203, 32, 240, 203, 203, 211, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 212, 203, 234, 
-	203, 277, 203, 262, 262, 6, 1, 208, 
-	209, 203, 203, 203, 217, 203, 234, 203, 
-	234, 203, 203, 203, 253, 253, 203, 1, 
-	208, 209, 203, 203, 203, 217, 203, 234, 
-	203, 234, 203, 203, 203, 253, 278, 203, 
-	1, 208, 209, 203, 203, 203, 217, 203, 
-	234, 203, 234, 203, 277, 203, 253, 253, 
-	203, 1, 208, 209, 203, 203, 203, 217, 
-	203, 234, 203, 234, 3, 203, 203, 19, 
-	235, 203, 1, 208, 209, 203, 203, 203, 
-	217, 203, 234, 203, 227, 228, 233, 233, 
-	6, 1, 208, 209, 203, 203, 203, 231, 
-	203, 203, 211, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	212, 203, 227, 228, 229, 233, 6, 1, 
-	208, 209, 203, 203, 34, 231, 203, 203, 
-	211, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 212, 203, 
-	225, 203, 279, 203, 262, 262, 6, 1, 
-	208, 209, 203, 203, 203, 217, 203, 225, 
-	203, 225, 203, 203, 203, 253, 253, 203, 
-	1, 208, 209, 203, 203, 203, 217, 203, 
-	225, 203, 225, 203, 203, 203, 253, 280, 
-	203, 1, 208, 209, 203, 203, 203, 217, 
-	203, 225, 203, 225, 203, 279, 203, 253, 
-	253, 203, 1, 208, 209, 203, 203, 203, 
-	217, 203, 225, 203, 225, 3, 203, 203, 
-	19, 226, 203, 1, 208, 209, 203, 203, 
-	203, 217, 203, 225, 203, 218, 219, 224, 
-	224, 6, 1, 208, 209, 203, 203, 203, 
-	222, 203, 203, 211, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 212, 203, 218, 219, 220, 224, 6, 
-	1, 208, 209, 203, 203, 36, 222, 203, 
-	203, 211, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 212, 
-	203, 215, 203, 281, 203, 262, 262, 6, 
-	1, 208, 209, 203, 203, 203, 217, 203, 
-	215, 203, 215, 203, 203, 203, 253, 253, 
-	203, 1, 208, 209, 203, 203, 203, 217, 
-	203, 215, 203, 215, 203, 203, 203, 253, 
-	282, 203, 1, 208, 209, 203, 203, 203, 
-	217, 203, 215, 203, 215, 203, 281, 203, 
-	253, 253, 203, 1, 208, 209, 203, 203, 
-	203, 217, 203, 215, 203, 215, 3, 203, 
-	203, 19, 216, 203, 1, 208, 209, 203, 
-	203, 203, 217, 203, 215, 203, 204, 205, 
-	214, 214, 6, 1, 208, 209, 203, 203, 
-	203, 210, 203, 203, 211, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 212, 203, 204, 205, 206, 214, 
-	6, 1, 208, 209, 203, 203, 38, 210, 
-	203, 203, 211, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	212, 203, 284, 285, 286, 287, 45, 40, 
-	288, 289, 283, 283, 77, 290, 283, 283, 
-	291, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 292, 283, 
-	293, 285, 294, 287, 45, 40, 288, 289, 
-	283, 283, 283, 290, 283, 283, 291, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 292, 283, 285, 294, 
-	287, 45, 40, 288, 289, 283, 283, 283, 
-	290, 283, 283, 291, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 292, 283, 295, 283, 283, 283, 58, 
-	296, 283, 40, 288, 289, 283, 283, 283, 
-	297, 283, 295, 283, 298, 299, 300, 301, 
-	45, 40, 288, 289, 283, 283, 75, 302, 
-	283, 283, 291, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	292, 283, 303, 299, 304, 304, 45, 40, 
-	288, 289, 283, 283, 283, 302, 283, 283, 
-	291, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 292, 283, 
-	299, 304, 304, 45, 40, 288, 289, 283, 
-	283, 283, 302, 283, 283, 291, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 292, 283, 305, 283, 283, 
-	283, 58, 306, 283, 40, 288, 289, 283, 
-	283, 283, 297, 283, 305, 283, 307, 308, 
-	309, 310, 45, 40, 288, 289, 283, 283, 
-	73, 311, 283, 283, 291, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 292, 283, 312, 308, 313, 313, 
-	45, 40, 288, 289, 283, 283, 283, 311, 
-	283, 283, 291, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	292, 283, 308, 313, 313, 45, 40, 288, 
-	289, 283, 283, 283, 311, 283, 283, 291, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 292, 283, 314, 
-	283, 283, 283, 58, 315, 283, 40, 288, 
-	289, 283, 283, 283, 297, 283, 314, 283, 
-	316, 317, 318, 319, 45, 40, 288, 289, 
-	283, 283, 71, 320, 283, 283, 291, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 292, 283, 321, 317, 
-	322, 322, 45, 40, 288, 289, 283, 283, 
-	283, 320, 283, 283, 291, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 292, 283, 317, 322, 322, 45, 
-	40, 288, 289, 283, 283, 283, 320, 283, 
-	283, 291, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 292, 
-	283, 323, 283, 283, 283, 58, 324, 283, 
-	40, 288, 289, 283, 283, 283, 297, 283, 
-	323, 283, 325, 326, 327, 328, 45, 40, 
-	288, 289, 283, 283, 69, 329, 283, 283, 
-	291, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 292, 283, 
-	330, 326, 331, 331, 45, 40, 288, 289, 
-	283, 283, 283, 329, 283, 283, 291, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 292, 283, 326, 331, 
-	331, 45, 40, 288, 289, 283, 283, 283, 
-	329, 283, 283, 291, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 292, 283, 58, 332, 283, 40, 288, 
-	289, 283, 283, 283, 297, 283, 333, 333, 
-	283, 40, 288, 289, 283, 283, 283, 297, 
-	283, 334, 283, 283, 335, 288, 289, 283, 
-	288, 289, 283, 336, 283, 288, 337, 283, 
-	288, 338, 283, 288, 283, 334, 283, 283, 
-	283, 288, 289, 283, 339, 283, 340, 341, 
-	283, 40, 288, 289, 283, 283, 43, 283, 
-	42, 283, 333, 333, 283, 40, 288, 289, 
-	283, 333, 333, 283, 40, 288, 289, 283, 
-	339, 283, 333, 333, 283, 40, 288, 289, 
-	283, 339, 283, 340, 333, 283, 40, 288, 
-	289, 283, 283, 43, 283, 58, 283, 342, 
-	342, 45, 40, 288, 289, 283, 283, 283, 
-	297, 283, 343, 67, 344, 345, 48, 40, 
-	288, 289, 283, 283, 283, 297, 283, 67, 
-	344, 345, 48, 40, 288, 289, 283, 283, 
-	283, 297, 283, 344, 344, 48, 40, 288, 
-	289, 283, 283, 283, 297, 283, 346, 64, 
-	347, 348, 51, 40, 288, 289, 283, 283, 
-	283, 297, 283, 64, 347, 348, 51, 40, 
-	288, 289, 283, 283, 283, 297, 283, 347, 
-	347, 51, 40, 288, 289, 283, 283, 283, 
-	297, 283, 349, 61, 350, 351, 54, 40, 
-	288, 289, 283, 283, 283, 297, 283, 61, 
-	350, 351, 54, 40, 288, 289, 283, 283, 
-	283, 297, 283, 350, 350, 54, 40, 288, 
-	289, 283, 283, 283, 297, 283, 352, 58, 
-	333, 353, 283, 40, 288, 289, 283, 283, 
-	283, 297, 283, 58, 333, 353, 283, 40, 
-	288, 289, 283, 283, 283, 297, 283, 333, 
-	354, 283, 40, 288, 289, 283, 283, 283, 
-	297, 283, 58, 283, 333, 333, 283, 40, 
-	288, 289, 283, 283, 283, 297, 283, 41, 
-	42, 283, 283, 58, 332, 283, 40, 288, 
-	289, 283, 283, 283, 297, 283, 41, 283, 
-	326, 331, 331, 45, 40, 288, 289, 283, 
-	283, 283, 329, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 292, 283, 326, 331, 331, 
-	45, 40, 288, 289, 283, 283, 283, 329, 
-	283, 325, 326, 331, 331, 45, 40, 288, 
-	289, 283, 283, 283, 329, 283, 283, 291, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 292, 283, 325, 
-	326, 327, 331, 45, 40, 288, 289, 283, 
-	283, 69, 329, 283, 283, 291, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 292, 283, 323, 283, 355, 
-	283, 342, 342, 45, 40, 288, 289, 283, 
-	283, 283, 297, 283, 323, 283, 323, 283, 
-	283, 283, 333, 333, 283, 40, 288, 289, 
-	283, 283, 283, 297, 283, 323, 283, 323, 
-	283, 283, 283, 333, 356, 283, 40, 288, 
-	289, 283, 283, 283, 297, 283, 323, 283, 
-	323, 283, 355, 283, 333, 333, 283, 40, 
-	288, 289, 283, 283, 283, 297, 283, 323, 
-	283, 323, 42, 283, 283, 58, 324, 283, 
-	40, 288, 289, 283, 283, 283, 297, 283, 
-	323, 283, 316, 317, 322, 322, 45, 40, 
-	288, 289, 283, 283, 283, 320, 283, 283, 
-	291, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 292, 283, 
-	316, 317, 318, 322, 45, 40, 288, 289, 
-	283, 283, 71, 320, 283, 283, 291, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 292, 283, 314, 283, 
-	357, 283, 342, 342, 45, 40, 288, 289, 
-	283, 283, 283, 297, 283, 314, 283, 314, 
-	283, 283, 283, 333, 333, 283, 40, 288, 
-	289, 283, 283, 283, 297, 283, 314, 283, 
-	314, 283, 283, 283, 333, 358, 283, 40, 
-	288, 289, 283, 283, 283, 297, 283, 314, 
-	283, 314, 283, 357, 283, 333, 333, 283, 
-	40, 288, 289, 283, 283, 283, 297, 283, 
-	314, 283, 314, 42, 283, 283, 58, 315, 
-	283, 40, 288, 289, 283, 283, 283, 297, 
-	283, 314, 283, 307, 308, 313, 313, 45, 
-	40, 288, 289, 283, 283, 283, 311, 283, 
-	283, 291, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 292, 
-	283, 307, 308, 309, 313, 45, 40, 288, 
-	289, 283, 283, 73, 311, 283, 283, 291, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 292, 283, 305, 
-	283, 359, 283, 342, 342, 45, 40, 288, 
-	289, 283, 283, 283, 297, 283, 305, 283, 
-	305, 283, 283, 283, 333, 333, 283, 40, 
-	288, 289, 283, 283, 283, 297, 283, 305, 
-	283, 305, 283, 283, 283, 333, 360, 283, 
-	40, 288, 289, 283, 283, 283, 297, 283, 
-	305, 283, 305, 283, 359, 283, 333, 333, 
-	283, 40, 288, 289, 283, 283, 283, 297, 
-	283, 305, 283, 305, 42, 283, 283, 58, 
-	306, 283, 40, 288, 289, 283, 283, 283, 
-	297, 283, 305, 283, 298, 299, 304, 304, 
-	45, 40, 288, 289, 283, 283, 283, 302, 
-	283, 283, 291, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	292, 283, 298, 299, 300, 304, 45, 40, 
-	288, 289, 283, 283, 75, 302, 283, 283, 
-	291, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 283, 292, 283, 
-	295, 283, 361, 283, 342, 342, 45, 40, 
-	288, 289, 283, 283, 283, 297, 283, 295, 
-	283, 295, 283, 283, 283, 333, 333, 283, 
-	40, 288, 289, 283, 283, 283, 297, 283, 
-	295, 283, 295, 283, 283, 283, 333, 362, 
-	283, 40, 288, 289, 283, 283, 283, 297, 
-	283, 295, 283, 295, 283, 361, 283, 333, 
-	333, 283, 40, 288, 289, 283, 283, 283, 
-	297, 283, 295, 283, 76, 44, 44, 45, 
-	40, 283, 283, 283, 283, 283, 76, 283, 
-	295, 42, 283, 283, 58, 296, 283, 40, 
-	288, 289, 283, 283, 283, 297, 283, 295, 
-	283, 284, 285, 294, 287, 45, 40, 288, 
-	289, 283, 283, 283, 290, 283, 283, 291, 
-	283, 283, 283, 283, 283, 283, 283, 283, 
-	283, 283, 283, 283, 283, 292, 283, 364, 
-	191, 365, 365, 84, 79, 194, 195, 363, 
-	363, 363, 197, 363, 363, 200, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 202, 363, 191, 365, 365, 
-	84, 79, 194, 195, 363, 363, 363, 197, 
-	363, 363, 200, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	202, 363, 366, 363, 363, 363, 98, 367, 
-	363, 79, 194, 195, 363, 363, 363, 368, 
-	363, 366, 363, 369, 370, 371, 372, 84, 
-	79, 194, 195, 363, 363, 115, 373, 363, 
-	363, 200, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 202, 
-	363, 374, 370, 375, 375, 84, 79, 194, 
-	195, 363, 363, 363, 373, 363, 363, 200, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 202, 363, 370, 
-	375, 375, 84, 79, 194, 195, 363, 363, 
-	363, 373, 363, 363, 200, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 202, 363, 376, 363, 363, 363, 
-	98, 377, 363, 79, 194, 195, 363, 363, 
-	363, 368, 363, 376, 363, 378, 379, 380, 
-	381, 84, 79, 194, 195, 363, 363, 113, 
-	382, 363, 363, 200, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 202, 363, 383, 379, 384, 384, 84, 
-	79, 194, 195, 363, 363, 363, 382, 363, 
-	363, 200, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 202, 
-	363, 379, 384, 384, 84, 79, 194, 195, 
-	363, 363, 363, 382, 363, 363, 200, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 202, 363, 385, 363, 
-	363, 363, 98, 386, 363, 79, 194, 195, 
-	363, 363, 363, 368, 363, 385, 363, 387, 
-	388, 389, 390, 84, 79, 194, 195, 363, 
-	363, 111, 391, 363, 363, 200, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 202, 363, 392, 388, 393, 
-	393, 84, 79, 194, 195, 363, 363, 363, 
-	391, 363, 363, 200, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 202, 363, 388, 393, 393, 84, 79, 
-	194, 195, 363, 363, 363, 391, 363, 363, 
-	200, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 202, 363, 
-	394, 363, 363, 363, 98, 395, 363, 79, 
-	194, 195, 363, 363, 363, 368, 363, 394, 
-	363, 396, 397, 398, 399, 84, 79, 194, 
-	195, 363, 363, 109, 400, 363, 363, 200, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 202, 363, 401, 
-	397, 402, 402, 84, 79, 194, 195, 363, 
-	363, 363, 400, 363, 363, 200, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 202, 363, 397, 402, 402, 
-	84, 79, 194, 195, 363, 363, 363, 400, 
-	363, 363, 200, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	202, 363, 98, 403, 363, 79, 194, 195, 
-	363, 363, 363, 368, 363, 404, 404, 363, 
-	79, 194, 195, 363, 363, 363, 368, 363, 
-	405, 363, 363, 406, 194, 195, 363, 194, 
-	195, 363, 407, 363, 194, 408, 363, 194, 
-	409, 363, 194, 363, 405, 363, 363, 363, 
-	194, 195, 363, 410, 363, 411, 412, 363, 
-	79, 194, 195, 363, 363, 82, 363, 81, 
-	363, 404, 404, 363, 79, 194, 195, 363, 
-	404, 404, 363, 79, 194, 195, 363, 410, 
-	363, 404, 404, 363, 79, 194, 195, 363, 
-	410, 363, 411, 404, 363, 79, 194, 195, 
-	363, 363, 82, 363, 98, 363, 413, 413, 
-	84, 79, 194, 195, 363, 363, 363, 368, 
-	363, 414, 107, 415, 416, 88, 79, 194, 
-	195, 363, 363, 363, 368, 363, 107, 415, 
-	416, 88, 79, 194, 195, 363, 363, 363, 
-	368, 363, 415, 415, 88, 79, 194, 195, 
-	363, 363, 363, 368, 363, 417, 104, 418, 
-	419, 91, 79, 194, 195, 363, 363, 363, 
-	368, 363, 104, 418, 419, 91, 79, 194, 
-	195, 363, 363, 363, 368, 363, 418, 418, 
-	91, 79, 194, 195, 363, 363, 363, 368, 
-	363, 420, 101, 421, 422, 94, 79, 194, 
-	195, 363, 363, 363, 368, 363, 101, 421, 
-	422, 94, 79, 194, 195, 363, 363, 363, 
-	368, 363, 421, 421, 94, 79, 194, 195, 
-	363, 363, 363, 368, 363, 423, 98, 404, 
-	424, 363, 79, 194, 195, 363, 363, 363, 
-	368, 363, 98, 404, 424, 363, 79, 194, 
-	195, 363, 363, 363, 368, 363, 404, 425, 
-	363, 79, 194, 195, 363, 363, 363, 368, 
-	363, 98, 363, 404, 404, 363, 79, 194, 
-	195, 363, 363, 363, 368, 363, 80, 81, 
-	363, 363, 98, 403, 363, 79, 194, 195, 
-	363, 363, 363, 368, 363, 80, 363, 397, 
-	402, 402, 84, 79, 194, 195, 363, 363, 
-	363, 400, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 202, 363, 397, 402, 402, 84, 
-	79, 194, 195, 363, 363, 363, 400, 363, 
-	396, 397, 402, 402, 84, 79, 194, 195, 
-	363, 363, 363, 400, 363, 363, 200, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 202, 363, 396, 397, 
-	398, 402, 84, 79, 194, 195, 363, 363, 
-	109, 400, 363, 363, 200, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 202, 363, 394, 363, 426, 363, 
-	413, 413, 84, 79, 194, 195, 363, 363, 
-	363, 368, 363, 394, 363, 394, 363, 363, 
-	363, 404, 404, 363, 79, 194, 195, 363, 
-	363, 363, 368, 363, 394, 363, 394, 363, 
-	363, 363, 404, 427, 363, 79, 194, 195, 
-	363, 363, 363, 368, 363, 394, 363, 394, 
-	363, 426, 363, 404, 404, 363, 79, 194, 
-	195, 363, 363, 363, 368, 363, 394, 363, 
-	394, 81, 363, 363, 98, 395, 363, 79, 
-	194, 195, 363, 363, 363, 368, 363, 394, 
-	363, 387, 388, 393, 393, 84, 79, 194, 
-	195, 363, 363, 363, 391, 363, 363, 200, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 202, 363, 387, 
-	388, 389, 393, 84, 79, 194, 195, 363, 
-	363, 111, 391, 363, 363, 200, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 202, 363, 385, 363, 428, 
-	363, 413, 413, 84, 79, 194, 195, 363, 
-	363, 363, 368, 363, 385, 363, 385, 363, 
-	363, 363, 404, 404, 363, 79, 194, 195, 
-	363, 363, 363, 368, 363, 385, 363, 385, 
-	363, 363, 363, 404, 429, 363, 79, 194, 
-	195, 363, 363, 363, 368, 363, 385, 363, 
-	385, 363, 428, 363, 404, 404, 363, 79, 
-	194, 195, 363, 363, 363, 368, 363, 385, 
-	363, 385, 81, 363, 363, 98, 386, 363, 
-	79, 194, 195, 363, 363, 363, 368, 363, 
-	385, 363, 378, 379, 384, 384, 84, 79, 
-	194, 195, 363, 363, 363, 382, 363, 363, 
-	200, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 202, 363, 
-	378, 379, 380, 384, 84, 79, 194, 195, 
-	363, 363, 113, 382, 363, 363, 200, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 202, 363, 376, 363, 
-	430, 363, 413, 413, 84, 79, 194, 195, 
-	363, 363, 363, 368, 363, 376, 363, 376, 
-	363, 363, 363, 404, 404, 363, 79, 194, 
-	195, 363, 363, 363, 368, 363, 376, 363, 
-	376, 363, 363, 363, 404, 431, 363, 79, 
-	194, 195, 363, 363, 363, 368, 363, 376, 
-	363, 376, 363, 430, 363, 404, 404, 363, 
-	79, 194, 195, 363, 363, 363, 368, 363, 
-	376, 363, 376, 81, 363, 363, 98, 377, 
-	363, 79, 194, 195, 363, 363, 363, 368, 
-	363, 376, 363, 369, 370, 375, 375, 84, 
-	79, 194, 195, 363, 363, 363, 373, 363, 
-	363, 200, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 202, 
-	363, 369, 370, 371, 375, 84, 79, 194, 
-	195, 363, 363, 115, 373, 363, 363, 200, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 202, 363, 366, 
-	363, 432, 363, 413, 413, 84, 79, 194, 
-	195, 363, 363, 363, 368, 363, 366, 363, 
-	366, 363, 363, 363, 404, 404, 363, 79, 
-	194, 195, 363, 363, 363, 368, 363, 366, 
-	363, 366, 363, 363, 363, 404, 433, 363, 
-	79, 194, 195, 363, 363, 363, 368, 363, 
-	366, 363, 366, 363, 432, 363, 404, 404, 
-	363, 79, 194, 195, 363, 363, 363, 368, 
-	363, 366, 363, 366, 81, 363, 363, 98, 
-	367, 363, 79, 194, 195, 363, 363, 363, 
-	368, 363, 366, 363, 116, 83, 83, 84, 
-	79, 434, 434, 434, 434, 156, 116, 434, 
-	190, 191, 365, 365, 84, 79, 194, 195, 
-	363, 363, 363, 197, 363, 363, 200, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 363, 363, 363, 202, 363, 116, 83, 
-	83, 84, 79, 434, 434, 434, 434, 434, 
-	116, 434, 436, 437, 438, 439, 123, 118, 
-	440, 441, 435, 435, 155, 442, 435, 435, 
-	443, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 444, 435, 
-	445, 437, 439, 439, 123, 118, 440, 441, 
-	435, 435, 435, 442, 435, 435, 443, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 444, 435, 437, 439, 
-	439, 123, 118, 440, 441, 435, 435, 435, 
-	442, 435, 435, 443, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 444, 435, 446, 435, 435, 435, 136, 
-	447, 435, 118, 440, 441, 435, 435, 435, 
-	448, 435, 446, 435, 449, 450, 451, 452, 
-	123, 118, 440, 441, 435, 435, 153, 453, 
-	435, 435, 443, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	444, 435, 454, 450, 455, 455, 123, 118, 
-	440, 441, 435, 435, 435, 453, 435, 435, 
-	443, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 444, 435, 
-	450, 455, 455, 123, 118, 440, 441, 435, 
-	435, 435, 453, 435, 435, 443, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 444, 435, 456, 435, 435, 
-	435, 136, 457, 435, 118, 440, 441, 435, 
-	435, 435, 448, 435, 456, 435, 458, 459, 
-	460, 461, 123, 118, 440, 441, 435, 435, 
-	151, 462, 435, 435, 443, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 444, 435, 463, 459, 464, 464, 
-	123, 118, 440, 441, 435, 435, 435, 462, 
-	435, 435, 443, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	444, 435, 459, 464, 464, 123, 118, 440, 
-	441, 435, 435, 435, 462, 435, 435, 443, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 444, 435, 465, 
-	435, 435, 435, 136, 466, 435, 118, 440, 
-	441, 435, 435, 435, 448, 435, 465, 435, 
-	467, 468, 469, 470, 123, 118, 440, 441, 
-	435, 435, 149, 471, 435, 435, 443, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 444, 435, 472, 468, 
-	473, 473, 123, 118, 440, 441, 435, 435, 
-	435, 471, 435, 435, 443, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 444, 435, 468, 473, 473, 123, 
-	118, 440, 441, 435, 435, 435, 471, 435, 
-	435, 443, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 444, 
-	435, 474, 435, 435, 435, 136, 475, 435, 
-	118, 440, 441, 435, 435, 435, 448, 435, 
-	474, 435, 476, 477, 478, 479, 123, 118, 
-	440, 441, 435, 435, 147, 480, 435, 435, 
-	443, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 444, 435, 
-	481, 477, 482, 482, 123, 118, 440, 441, 
-	435, 435, 435, 480, 435, 435, 443, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 444, 435, 477, 482, 
-	482, 123, 118, 440, 441, 435, 435, 435, 
-	480, 435, 435, 443, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 444, 435, 136, 483, 435, 118, 440, 
-	441, 435, 435, 435, 448, 435, 484, 484, 
-	435, 118, 440, 441, 435, 435, 435, 448, 
-	435, 485, 435, 435, 486, 440, 441, 435, 
-	440, 441, 435, 487, 435, 440, 488, 435, 
-	440, 489, 435, 440, 435, 485, 435, 435, 
-	435, 440, 441, 435, 490, 435, 491, 492, 
-	435, 118, 440, 441, 435, 435, 121, 435, 
-	120, 435, 484, 484, 435, 118, 440, 441, 
-	435, 484, 484, 435, 118, 440, 441, 435, 
-	490, 435, 484, 484, 435, 118, 440, 441, 
-	435, 490, 435, 491, 484, 435, 118, 440, 
-	441, 435, 435, 121, 435, 136, 435, 493, 
-	493, 123, 118, 440, 441, 435, 435, 435, 
-	448, 435, 494, 145, 495, 496, 126, 118, 
-	440, 441, 435, 435, 435, 448, 435, 145, 
-	495, 496, 126, 118, 440, 441, 435, 435, 
-	435, 448, 435, 495, 495, 126, 118, 440, 
-	441, 435, 435, 435, 448, 435, 497, 142, 
-	498, 499, 129, 118, 440, 441, 435, 435, 
-	435, 448, 435, 142, 498, 499, 129, 118, 
-	440, 441, 435, 435, 435, 448, 435, 498, 
-	498, 129, 118, 440, 441, 435, 435, 435, 
-	448, 435, 500, 139, 501, 502, 132, 118, 
-	440, 441, 435, 435, 435, 448, 435, 139, 
-	501, 502, 132, 118, 440, 441, 435, 435, 
-	435, 448, 435, 501, 501, 132, 118, 440, 
-	441, 435, 435, 435, 448, 435, 503, 136, 
-	484, 504, 435, 118, 440, 441, 435, 435, 
-	435, 448, 435, 136, 484, 504, 435, 118, 
-	440, 441, 435, 435, 435, 448, 435, 484, 
-	505, 435, 118, 440, 441, 435, 435, 435, 
-	448, 435, 136, 435, 484, 484, 435, 118, 
-	440, 441, 435, 435, 435, 448, 435, 119, 
-	120, 435, 435, 136, 483, 435, 118, 440, 
-	441, 435, 435, 435, 448, 435, 119, 435, 
-	477, 482, 482, 123, 118, 440, 441, 435, 
-	435, 435, 480, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 444, 435, 477, 482, 482, 
-	123, 118, 440, 441, 435, 435, 435, 480, 
-	435, 476, 477, 482, 482, 123, 118, 440, 
-	441, 435, 435, 435, 480, 435, 435, 443, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 444, 435, 476, 
-	477, 478, 482, 123, 118, 440, 441, 435, 
-	435, 147, 480, 435, 435, 443, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 444, 435, 474, 435, 506, 
-	435, 493, 493, 123, 118, 440, 441, 435, 
-	435, 435, 448, 435, 474, 435, 474, 435, 
-	435, 435, 484, 484, 435, 118, 440, 441, 
-	435, 435, 435, 448, 435, 474, 435, 474, 
-	435, 435, 435, 484, 507, 435, 118, 440, 
-	441, 435, 435, 435, 448, 435, 474, 435, 
-	474, 435, 506, 435, 484, 484, 435, 118, 
-	440, 441, 435, 435, 435, 448, 435, 474, 
-	435, 474, 120, 435, 435, 136, 475, 435, 
-	118, 440, 441, 435, 435, 435, 448, 435, 
-	474, 435, 467, 468, 473, 473, 123, 118, 
-	440, 441, 435, 435, 435, 471, 435, 435, 
-	443, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 444, 435, 
-	467, 468, 469, 473, 123, 118, 440, 441, 
-	435, 435, 149, 471, 435, 435, 443, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 444, 435, 465, 435, 
-	508, 435, 493, 493, 123, 118, 440, 441, 
-	435, 435, 435, 448, 435, 465, 435, 465, 
-	435, 435, 435, 484, 484, 435, 118, 440, 
-	441, 435, 435, 435, 448, 435, 465, 435, 
-	465, 435, 435, 435, 484, 509, 435, 118, 
-	440, 441, 435, 435, 435, 448, 435, 465, 
-	435, 465, 435, 508, 435, 484, 484, 435, 
-	118, 440, 441, 435, 435, 435, 448, 435, 
-	465, 435, 465, 120, 435, 435, 136, 466, 
-	435, 118, 440, 441, 435, 435, 435, 448, 
-	435, 465, 435, 458, 459, 464, 464, 123, 
-	118, 440, 441, 435, 435, 435, 462, 435, 
-	435, 443, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 444, 
-	435, 458, 459, 460, 464, 123, 118, 440, 
-	441, 435, 435, 151, 462, 435, 435, 443, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 444, 435, 456, 
-	435, 510, 435, 493, 493, 123, 118, 440, 
-	441, 435, 435, 435, 448, 435, 456, 435, 
-	456, 435, 435, 435, 484, 484, 435, 118, 
-	440, 441, 435, 435, 435, 448, 435, 456, 
-	435, 456, 435, 435, 435, 484, 511, 435, 
-	118, 440, 441, 435, 435, 435, 448, 435, 
-	456, 435, 456, 435, 510, 435, 484, 484, 
-	435, 118, 440, 441, 435, 435, 435, 448, 
-	435, 456, 435, 456, 120, 435, 435, 136, 
-	457, 435, 118, 440, 441, 435, 435, 435, 
-	448, 435, 456, 435, 449, 450, 455, 455, 
-	123, 118, 440, 441, 435, 435, 435, 453, 
-	435, 435, 443, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	444, 435, 449, 450, 451, 455, 123, 118, 
-	440, 441, 435, 435, 153, 453, 435, 435, 
-	443, 435, 435, 435, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 444, 435, 
-	446, 435, 512, 435, 493, 493, 123, 118, 
-	440, 441, 435, 435, 435, 448, 435, 446, 
-	435, 446, 435, 435, 435, 484, 484, 435, 
-	118, 440, 441, 435, 435, 435, 448, 435, 
-	446, 435, 446, 435, 435, 435, 484, 513, 
-	435, 118, 440, 441, 435, 435, 435, 448, 
-	435, 446, 435, 446, 435, 512, 435, 484, 
-	484, 435, 118, 440, 441, 435, 435, 435, 
-	448, 435, 446, 435, 446, 120, 435, 435, 
-	136, 447, 435, 118, 440, 441, 435, 435, 
-	435, 448, 435, 446, 435, 436, 437, 439, 
-	439, 123, 118, 440, 441, 435, 435, 435, 
-	442, 435, 435, 443, 435, 435, 435, 435, 
-	435, 435, 435, 435, 435, 435, 435, 435, 
-	435, 444, 435, 188, 189, 190, 191, 514, 
-	365, 84, 79, 194, 195, 196, 196, 156, 
-	197, 363, 188, 200, 363, 363, 363, 363, 
-	363, 363, 363, 363, 363, 363, 363, 363, 
-	363, 202, 363, 204, 515, 206, 207, 6, 
-	1, 208, 209, 203, 203, 38, 210, 203, 
-	203, 211, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 212, 
-	203, 215, 189, 190, 191, 516, 517, 84, 
-	157, 518, 519, 203, 196, 156, 520, 203, 
-	215, 200, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 202, 
-	203, 116, 521, 521, 84, 157, 208, 209, 
-	203, 203, 156, 522, 203, 523, 203, 203, 
-	524, 518, 519, 203, 518, 519, 203, 256, 
-	203, 518, 525, 203, 518, 526, 203, 518, 
-	203, 523, 203, 203, 203, 518, 519, 203, 
-	527, 3, 363, 363, 404, 433, 363, 79, 
-	194, 195, 363, 363, 363, 368, 363, 527, 
-	363, 528, 370, 529, 530, 84, 157, 518, 
-	519, 203, 203, 158, 373, 203, 203, 200, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 202, 203, 531, 
-	370, 532, 532, 84, 157, 518, 519, 203, 
-	203, 203, 373, 203, 203, 200, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 202, 203, 370, 532, 532, 
-	84, 157, 518, 519, 203, 203, 203, 373, 
-	203, 203, 200, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	202, 203, 528, 370, 532, 532, 84, 157, 
-	518, 519, 203, 203, 203, 373, 203, 203, 
-	200, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 203, 203, 202, 203, 
-	528, 370, 529, 532, 84, 157, 518, 519, 
-	203, 203, 158, 373, 203, 203, 200, 203, 
-	203, 203, 203, 203, 203, 203, 203, 203, 
-	203, 203, 203, 203, 202, 203, 215, 203, 
-	281, 116, 533, 533, 160, 157, 208, 209, 
-	203, 203, 203, 522, 203, 215, 203, 534, 
-	184, 535, 536, 162, 157, 518, 519, 203, 
-	203, 203, 537, 203, 184, 535, 536, 162, 
-	157, 518, 519, 203, 203, 203, 537, 203, 
-	535, 535, 162, 157, 518, 519, 203, 203, 
-	203, 537, 203, 538, 181, 539, 540, 165, 
-	157, 518, 519, 203, 203, 203, 537, 203, 
-	181, 539, 540, 165, 157, 518, 519, 203, 
-	203, 203, 537, 203, 539, 539, 165, 157, 
-	518, 519, 203, 203, 203, 537, 203, 541, 
-	178, 542, 543, 168, 157, 518, 519, 203, 
-	203, 203, 537, 203, 178, 542, 543, 168, 
-	157, 518, 519, 203, 203, 203, 537, 203, 
-	542, 542, 168, 157, 518, 519, 203, 203, 
-	203, 537, 203, 544, 175, 545, 546, 203, 
-	157, 518, 519, 203, 203, 203, 537, 203, 
-	175, 545, 546, 203, 157, 518, 519, 203, 
-	203, 203, 537, 203, 545, 545, 203, 157, 
-	518, 519, 203, 203, 203, 537, 203, 547, 
-	203, 548, 549, 203, 157, 518, 519, 203, 
-	203, 172, 203, 171, 203, 545, 545, 203, 
-	157, 518, 519, 203, 545, 545, 203, 157, 
-	518, 519, 203, 547, 203, 545, 545, 203, 
-	157, 518, 519, 203, 547, 203, 548, 545, 
-	203, 157, 518, 519, 203, 203, 172, 203, 
-	527, 171, 363, 363, 98, 367, 363, 79, 
-	194, 195, 363, 363, 363, 368, 363, 527, 
-	363, 551, 550, 552, 552, 550, 186, 553, 
-	554, 550, 552, 552, 550, 186, 553, 554, 
-	550, 555, 550, 550, 556, 553, 554, 550, 
-	553, 554, 550, 557, 550, 553, 558, 550, 
-	553, 559, 550, 553, 550, 555, 550, 550, 
-	550, 553, 554, 550, 0
+	197, 198, 199, 200, 201, 187, 203, 204, 
+	205, 206, 6, 1, 207, 208, 202, 202, 
+	38, 209, 202, 202, 210, 202, 211, 204, 
+	212, 212, 6, 1, 207, 208, 202, 202, 
+	202, 209, 202, 202, 210, 202, 204, 212, 
+	212, 6, 1, 207, 208, 202, 202, 202, 
+	209, 202, 202, 210, 202, 213, 202, 202, 
+	202, 19, 214, 202, 1, 207, 208, 202, 
+	202, 202, 215, 202, 213, 202, 216, 217, 
+	218, 219, 6, 1, 207, 208, 202, 202, 
+	36, 220, 202, 202, 210, 202, 221, 217, 
+	222, 222, 6, 1, 207, 208, 202, 202, 
+	202, 220, 202, 202, 210, 202, 217, 222, 
+	222, 6, 1, 207, 208, 202, 202, 202, 
+	220, 202, 202, 210, 202, 223, 202, 202, 
+	202, 19, 224, 202, 1, 207, 208, 202, 
+	202, 202, 215, 202, 223, 202, 225, 226, 
+	227, 228, 6, 1, 207, 208, 202, 202, 
+	34, 229, 202, 202, 210, 202, 230, 226, 
+	231, 231, 6, 1, 207, 208, 202, 202, 
+	202, 229, 202, 202, 210, 202, 226, 231, 
+	231, 6, 1, 207, 208, 202, 202, 202, 
+	229, 202, 202, 210, 202, 232, 202, 202, 
+	202, 19, 233, 202, 1, 207, 208, 202, 
+	202, 202, 215, 202, 232, 202, 234, 235, 
+	236, 237, 6, 1, 207, 208, 202, 202, 
+	32, 238, 202, 202, 210, 202, 239, 235, 
+	240, 240, 6, 1, 207, 208, 202, 202, 
+	202, 238, 202, 202, 210, 202, 235, 240, 
+	240, 6, 1, 207, 208, 202, 202, 202, 
+	238, 202, 202, 210, 202, 241, 202, 202, 
+	202, 19, 242, 202, 1, 207, 208, 202, 
+	202, 202, 215, 202, 241, 202, 243, 244, 
+	245, 246, 6, 1, 207, 208, 202, 202, 
+	30, 247, 202, 202, 210, 202, 248, 244, 
+	249, 249, 6, 1, 207, 208, 202, 202, 
+	202, 247, 202, 202, 210, 202, 244, 249, 
+	249, 6, 1, 207, 208, 202, 202, 202, 
+	247, 202, 202, 210, 202, 19, 250, 202, 
+	1, 207, 208, 202, 202, 202, 215, 202, 
+	251, 251, 202, 1, 207, 208, 202, 202, 
+	202, 215, 202, 252, 202, 202, 253, 207, 
+	208, 202, 207, 208, 202, 254, 202, 207, 
+	255, 202, 207, 256, 202, 207, 202, 252, 
+	202, 202, 202, 207, 208, 202, 257, 202, 
+	258, 259, 202, 1, 207, 208, 202, 202, 
+	4, 202, 3, 202, 251, 251, 202, 1, 
+	207, 208, 202, 251, 251, 202, 1, 207, 
+	208, 202, 257, 202, 251, 251, 202, 1, 
+	207, 208, 202, 257, 202, 258, 251, 202, 
+	1, 207, 208, 202, 202, 4, 202, 19, 
+	202, 260, 260, 6, 1, 207, 208, 202, 
+	202, 202, 215, 202, 261, 28, 262, 263, 
+	9, 1, 207, 208, 202, 202, 202, 215, 
+	202, 28, 262, 263, 9, 1, 207, 208, 
+	202, 202, 202, 215, 202, 262, 262, 9, 
+	1, 207, 208, 202, 202, 202, 215, 202, 
+	264, 25, 265, 266, 12, 1, 207, 208, 
+	202, 202, 202, 215, 202, 25, 265, 266, 
+	12, 1, 207, 208, 202, 202, 202, 215, 
+	202, 265, 265, 12, 1, 207, 208, 202, 
+	202, 202, 215, 202, 267, 22, 268, 269, 
+	15, 1, 207, 208, 202, 202, 202, 215, 
+	202, 22, 268, 269, 15, 1, 207, 208, 
+	202, 202, 202, 215, 202, 268, 268, 15, 
+	1, 207, 208, 202, 202, 202, 215, 202, 
+	270, 19, 251, 271, 202, 1, 207, 208, 
+	202, 202, 202, 215, 202, 19, 251, 271, 
+	202, 1, 207, 208, 202, 202, 202, 215, 
+	202, 251, 272, 202, 1, 207, 208, 202, 
+	202, 202, 215, 202, 19, 202, 251, 251, 
+	202, 1, 207, 208, 202, 202, 202, 215, 
+	202, 2, 3, 202, 202, 19, 250, 202, 
+	1, 207, 208, 202, 202, 202, 215, 202, 
+	2, 202, 244, 249, 249, 6, 1, 207, 
+	208, 202, 202, 202, 247, 202, 243, 244, 
+	249, 249, 6, 1, 207, 208, 202, 202, 
+	202, 247, 202, 202, 210, 202, 243, 244, 
+	245, 249, 6, 1, 207, 208, 202, 202, 
+	30, 247, 202, 202, 210, 202, 241, 202, 
+	273, 202, 260, 260, 6, 1, 207, 208, 
+	202, 202, 202, 215, 202, 241, 202, 241, 
+	202, 202, 202, 251, 251, 202, 1, 207, 
+	208, 202, 202, 202, 215, 202, 241, 202, 
+	241, 202, 202, 202, 251, 274, 202, 1, 
+	207, 208, 202, 202, 202, 215, 202, 241, 
+	202, 241, 202, 273, 202, 251, 251, 202, 
+	1, 207, 208, 202, 202, 202, 215, 202, 
+	241, 202, 241, 3, 202, 202, 19, 242, 
+	202, 1, 207, 208, 202, 202, 202, 215, 
+	202, 241, 202, 234, 235, 240, 240, 6, 
+	1, 207, 208, 202, 202, 202, 238, 202, 
+	202, 210, 202, 234, 235, 236, 240, 6, 
+	1, 207, 208, 202, 202, 32, 238, 202, 
+	202, 210, 202, 232, 202, 275, 202, 260, 
+	260, 6, 1, 207, 208, 202, 202, 202, 
+	215, 202, 232, 202, 232, 202, 202, 202, 
+	251, 251, 202, 1, 207, 208, 202, 202, 
+	202, 215, 202, 232, 202, 232, 202, 202, 
+	202, 251, 276, 202, 1, 207, 208, 202, 
+	202, 202, 215, 202, 232, 202, 232, 202, 
+	275, 202, 251, 251, 202, 1, 207, 208, 
+	202, 202, 202, 215, 202, 232, 202, 232, 
+	3, 202, 202, 19, 233, 202, 1, 207, 
+	208, 202, 202, 202, 215, 202, 232, 202, 
+	225, 226, 231, 231, 6, 1, 207, 208, 
+	202, 202, 202, 229, 202, 202, 210, 202, 
+	225, 226, 227, 231, 6, 1, 207, 208, 
+	202, 202, 34, 229, 202, 202, 210, 202, 
+	223, 202, 277, 202, 260, 260, 6, 1, 
+	207, 208, 202, 202, 202, 215, 202, 223, 
+	202, 223, 202, 202, 202, 251, 251, 202, 
+	1, 207, 208, 202, 202, 202, 215, 202, 
+	223, 202, 223, 202, 202, 202, 251, 278, 
+	202, 1, 207, 208, 202, 202, 202, 215, 
+	202, 223, 202, 223, 202, 277, 202, 251, 
+	251, 202, 1, 207, 208, 202, 202, 202, 
+	215, 202, 223, 202, 223, 3, 202, 202, 
+	19, 224, 202, 1, 207, 208, 202, 202, 
+	202, 215, 202, 223, 202, 216, 217, 222, 
+	222, 6, 1, 207, 208, 202, 202, 202, 
+	220, 202, 202, 210, 202, 216, 217, 218, 
+	222, 6, 1, 207, 208, 202, 202, 36, 
+	220, 202, 202, 210, 202, 213, 202, 279, 
+	202, 260, 260, 6, 1, 207, 208, 202, 
+	202, 202, 215, 202, 213, 202, 213, 202, 
+	202, 202, 251, 251, 202, 1, 207, 208, 
+	202, 202, 202, 215, 202, 213, 202, 213, 
+	202, 202, 202, 251, 280, 202, 1, 207, 
+	208, 202, 202, 202, 215, 202, 213, 202, 
+	213, 202, 279, 202, 251, 251, 202, 1, 
+	207, 208, 202, 202, 202, 215, 202, 213, 
+	202, 213, 3, 202, 202, 19, 214, 202, 
+	1, 207, 208, 202, 202, 202, 215, 202, 
+	213, 202, 203, 204, 212, 212, 6, 1, 
+	207, 208, 202, 202, 202, 209, 202, 202, 
+	210, 202, 203, 204, 205, 212, 6, 1, 
+	207, 208, 202, 202, 38, 209, 202, 202, 
+	210, 202, 282, 283, 284, 285, 45, 40, 
+	286, 287, 281, 281, 77, 288, 281, 281, 
+	289, 281, 290, 283, 291, 285, 45, 40, 
+	286, 287, 281, 281, 281, 288, 281, 281, 
+	289, 281, 283, 291, 285, 45, 40, 286, 
+	287, 281, 281, 281, 288, 281, 281, 289, 
+	281, 292, 281, 281, 281, 58, 293, 281, 
+	40, 286, 287, 281, 281, 281, 294, 281, 
+	292, 281, 295, 296, 297, 298, 45, 40, 
+	286, 287, 281, 281, 75, 299, 281, 281, 
+	289, 281, 300, 296, 301, 301, 45, 40, 
+	286, 287, 281, 281, 281, 299, 281, 281, 
+	289, 281, 296, 301, 301, 45, 40, 286, 
+	287, 281, 281, 281, 299, 281, 281, 289, 
+	281, 302, 281, 281, 281, 58, 303, 281, 
+	40, 286, 287, 281, 281, 281, 294, 281, 
+	302, 281, 304, 305, 306, 307, 45, 40, 
+	286, 287, 281, 281, 73, 308, 281, 281, 
+	289, 281, 309, 305, 310, 310, 45, 40, 
+	286, 287, 281, 281, 281, 308, 281, 281, 
+	289, 281, 305, 310, 310, 45, 40, 286, 
+	287, 281, 281, 281, 308, 281, 281, 289, 
+	281, 311, 281, 281, 281, 58, 312, 281, 
+	40, 286, 287, 281, 281, 281, 294, 281, 
+	311, 281, 313, 314, 315, 316, 45, 40, 
+	286, 287, 281, 281, 71, 317, 281, 281, 
+	289, 281, 318, 314, 319, 319, 45, 40, 
+	286, 287, 281, 281, 281, 317, 281, 281, 
+	289, 281, 314, 319, 319, 45, 40, 286, 
+	287, 281, 281, 281, 317, 281, 281, 289, 
+	281, 320, 281, 281, 281, 58, 321, 281, 
+	40, 286, 287, 281, 281, 281, 294, 281, 
+	320, 281, 322, 323, 324, 325, 45, 40, 
+	286, 287, 281, 281, 69, 326, 281, 281, 
+	289, 281, 327, 323, 328, 328, 45, 40, 
+	286, 287, 281, 281, 281, 326, 281, 281, 
+	289, 281, 323, 328, 328, 45, 40, 286, 
+	287, 281, 281, 281, 326, 281, 281, 289, 
+	281, 58, 329, 281, 40, 286, 287, 281, 
+	281, 281, 294, 281, 330, 330, 281, 40, 
+	286, 287, 281, 281, 281, 294, 281, 331, 
+	281, 281, 332, 286, 287, 281, 286, 287, 
+	281, 333, 281, 286, 334, 281, 286, 335, 
+	281, 286, 281, 331, 281, 281, 281, 286, 
+	287, 281, 336, 281, 337, 338, 281, 40, 
+	286, 287, 281, 281, 43, 281, 42, 281, 
+	330, 330, 281, 40, 286, 287, 281, 330, 
+	330, 281, 40, 286, 287, 281, 336, 281, 
+	330, 330, 281, 40, 286, 287, 281, 336, 
+	281, 337, 330, 281, 40, 286, 287, 281, 
+	281, 43, 281, 58, 281, 339, 339, 45, 
+	40, 286, 287, 281, 281, 281, 294, 281, 
+	340, 67, 341, 342, 48, 40, 286, 287, 
+	281, 281, 281, 294, 281, 67, 341, 342, 
+	48, 40, 286, 287, 281, 281, 281, 294, 
+	281, 341, 341, 48, 40, 286, 287, 281, 
+	281, 281, 294, 281, 343, 64, 344, 345, 
+	51, 40, 286, 287, 281, 281, 281, 294, 
+	281, 64, 344, 345, 51, 40, 286, 287, 
+	281, 281, 281, 294, 281, 344, 344, 51, 
+	40, 286, 287, 281, 281, 281, 294, 281, 
+	346, 61, 347, 348, 54, 40, 286, 287, 
+	281, 281, 281, 294, 281, 61, 347, 348, 
+	54, 40, 286, 287, 281, 281, 281, 294, 
+	281, 347, 347, 54, 40, 286, 287, 281, 
+	281, 281, 294, 281, 349, 58, 330, 350, 
+	281, 40, 286, 287, 281, 281, 281, 294, 
+	281, 58, 330, 350, 281, 40, 286, 287, 
+	281, 281, 281, 294, 281, 330, 351, 281, 
+	40, 286, 287, 281, 281, 281, 294, 281, 
+	58, 281, 330, 330, 281, 40, 286, 287, 
+	281, 281, 281, 294, 281, 41, 42, 281, 
+	281, 58, 329, 281, 40, 286, 287, 281, 
+	281, 281, 294, 281, 41, 281, 323, 328, 
+	328, 45, 40, 286, 287, 281, 281, 281, 
+	326, 281, 322, 323, 328, 328, 45, 40, 
+	286, 287, 281, 281, 281, 326, 281, 281, 
+	289, 281, 322, 323, 324, 328, 45, 40, 
+	286, 287, 281, 281, 69, 326, 281, 281, 
+	289, 281, 320, 281, 352, 281, 339, 339, 
+	45, 40, 286, 287, 281, 281, 281, 294, 
+	281, 320, 281, 320, 281, 281, 281, 330, 
+	330, 281, 40, 286, 287, 281, 281, 281, 
+	294, 281, 320, 281, 320, 281, 281, 281, 
+	330, 353, 281, 40, 286, 287, 281, 281, 
+	281, 294, 281, 320, 281, 320, 281, 352, 
+	281, 330, 330, 281, 40, 286, 287, 281, 
+	281, 281, 294, 281, 320, 281, 320, 42, 
+	281, 281, 58, 321, 281, 40, 286, 287, 
+	281, 281, 281, 294, 281, 320, 281, 313, 
+	314, 319, 319, 45, 40, 286, 287, 281, 
+	281, 281, 317, 281, 281, 289, 281, 313, 
+	314, 315, 319, 45, 40, 286, 287, 281, 
+	281, 71, 317, 281, 281, 289, 281, 311, 
+	281, 354, 281, 339, 339, 45, 40, 286, 
+	287, 281, 281, 281, 294, 281, 311, 281, 
+	311, 281, 281, 281, 330, 330, 281, 40, 
+	286, 287, 281, 281, 281, 294, 281, 311, 
+	281, 311, 281, 281, 281, 330, 355, 281, 
+	40, 286, 287, 281, 281, 281, 294, 281, 
+	311, 281, 311, 281, 354, 281, 330, 330, 
+	281, 40, 286, 287, 281, 281, 281, 294, 
+	281, 311, 281, 311, 42, 281, 281, 58, 
+	312, 281, 40, 286, 287, 281, 281, 281, 
+	294, 281, 311, 281, 304, 305, 310, 310, 
+	45, 40, 286, 287, 281, 281, 281, 308, 
+	281, 281, 289, 281, 304, 305, 306, 310, 
+	45, 40, 286, 287, 281, 281, 73, 308, 
+	281, 281, 289, 281, 302, 281, 356, 281, 
+	339, 339, 45, 40, 286, 287, 281, 281, 
+	281, 294, 281, 302, 281, 302, 281, 281, 
+	281, 330, 330, 281, 40, 286, 287, 281, 
+	281, 281, 294, 281, 302, 281, 302, 281, 
+	281, 281, 330, 357, 281, 40, 286, 287, 
+	281, 281, 281, 294, 281, 302, 281, 302, 
+	281, 356, 281, 330, 330, 281, 40, 286, 
+	287, 281, 281, 281, 294, 281, 302, 281, 
+	302, 42, 281, 281, 58, 303, 281, 40, 
+	286, 287, 281, 281, 281, 294, 281, 302, 
+	281, 295, 296, 301, 301, 45, 40, 286, 
+	287, 281, 281, 281, 299, 281, 281, 289, 
+	281, 295, 296, 297, 301, 45, 40, 286, 
+	287, 281, 281, 75, 299, 281, 281, 289, 
+	281, 292, 281, 358, 281, 339, 339, 45, 
+	40, 286, 287, 281, 281, 281, 294, 281, 
+	292, 281, 292, 281, 281, 281, 330, 330, 
+	281, 40, 286, 287, 281, 281, 281, 294, 
+	281, 292, 281, 292, 281, 281, 281, 330, 
+	359, 281, 40, 286, 287, 281, 281, 281, 
+	294, 281, 292, 281, 292, 281, 358, 281, 
+	330, 330, 281, 40, 286, 287, 281, 281, 
+	281, 294, 281, 292, 281, 76, 44, 44, 
+	45, 40, 281, 281, 281, 281, 281, 76, 
+	281, 292, 42, 281, 281, 58, 293, 281, 
+	40, 286, 287, 281, 281, 281, 294, 281, 
+	292, 281, 282, 283, 291, 285, 45, 40, 
+	286, 287, 281, 281, 281, 288, 281, 281, 
+	289, 281, 361, 191, 362, 362, 84, 79, 
+	194, 195, 360, 360, 360, 197, 360, 360, 
+	200, 360, 191, 362, 362, 84, 79, 194, 
+	195, 360, 360, 360, 197, 360, 360, 200, 
+	360, 363, 360, 360, 360, 98, 364, 360, 
+	79, 194, 195, 360, 360, 360, 365, 360, 
+	363, 360, 366, 367, 368, 369, 84, 79, 
+	194, 195, 360, 360, 115, 370, 360, 360, 
+	200, 360, 371, 367, 372, 372, 84, 79, 
+	194, 195, 360, 360, 360, 370, 360, 360, 
+	200, 360, 367, 372, 372, 84, 79, 194, 
+	195, 360, 360, 360, 370, 360, 360, 200, 
+	360, 373, 360, 360, 360, 98, 374, 360, 
+	79, 194, 195, 360, 360, 360, 365, 360, 
+	373, 360, 375, 376, 377, 378, 84, 79, 
+	194, 195, 360, 360, 113, 379, 360, 360, 
+	200, 360, 380, 376, 381, 381, 84, 79, 
+	194, 195, 360, 360, 360, 379, 360, 360, 
+	200, 360, 376, 381, 381, 84, 79, 194, 
+	195, 360, 360, 360, 379, 360, 360, 200, 
+	360, 382, 360, 360, 360, 98, 383, 360, 
+	79, 194, 195, 360, 360, 360, 365, 360, 
+	382, 360, 384, 385, 386, 387, 84, 79, 
+	194, 195, 360, 360, 111, 388, 360, 360, 
+	200, 360, 389, 385, 390, 390, 84, 79, 
+	194, 195, 360, 360, 360, 388, 360, 360, 
+	200, 360, 385, 390, 390, 84, 79, 194, 
+	195, 360, 360, 360, 388, 360, 360, 200, 
+	360, 391, 360, 360, 360, 98, 392, 360, 
+	79, 194, 195, 360, 360, 360, 365, 360, 
+	391, 360, 393, 394, 395, 396, 84, 79, 
+	194, 195, 360, 360, 109, 397, 360, 360, 
+	200, 360, 398, 394, 399, 399, 84, 79, 
+	194, 195, 360, 360, 360, 397, 360, 360, 
+	200, 360, 394, 399, 399, 84, 79, 194, 
+	195, 360, 360, 360, 397, 360, 360, 200, 
+	360, 98, 400, 360, 79, 194, 195, 360, 
+	360, 360, 365, 360, 401, 401, 360, 79, 
+	194, 195, 360, 360, 360, 365, 360, 402, 
+	360, 360, 403, 194, 195, 360, 194, 195, 
+	360, 404, 360, 194, 405, 360, 194, 406, 
+	360, 194, 360, 402, 360, 360, 360, 194, 
+	195, 360, 407, 360, 408, 409, 360, 79, 
+	194, 195, 360, 360, 82, 360, 81, 360, 
+	401, 401, 360, 79, 194, 195, 360, 401, 
+	401, 360, 79, 194, 195, 360, 407, 360, 
+	401, 401, 360, 79, 194, 195, 360, 407, 
+	360, 408, 401, 360, 79, 194, 195, 360, 
+	360, 82, 360, 98, 360, 410, 410, 84, 
+	79, 194, 195, 360, 360, 360, 365, 360, 
+	411, 107, 412, 413, 88, 79, 194, 195, 
+	360, 360, 360, 365, 360, 107, 412, 413, 
+	88, 79, 194, 195, 360, 360, 360, 365, 
+	360, 412, 412, 88, 79, 194, 195, 360, 
+	360, 360, 365, 360, 414, 104, 415, 416, 
+	91, 79, 194, 195, 360, 360, 360, 365, 
+	360, 104, 415, 416, 91, 79, 194, 195, 
+	360, 360, 360, 365, 360, 415, 415, 91, 
+	79, 194, 195, 360, 360, 360, 365, 360, 
+	417, 101, 418, 419, 94, 79, 194, 195, 
+	360, 360, 360, 365, 360, 101, 418, 419, 
+	94, 79, 194, 195, 360, 360, 360, 365, 
+	360, 418, 418, 94, 79, 194, 195, 360, 
+	360, 360, 365, 360, 420, 98, 401, 421, 
+	360, 79, 194, 195, 360, 360, 360, 365, 
+	360, 98, 401, 421, 360, 79, 194, 195, 
+	360, 360, 360, 365, 360, 401, 422, 360, 
+	79, 194, 195, 360, 360, 360, 365, 360, 
+	98, 360, 401, 401, 360, 79, 194, 195, 
+	360, 360, 360, 365, 360, 80, 81, 360, 
+	360, 98, 400, 360, 79, 194, 195, 360, 
+	360, 360, 365, 360, 80, 360, 394, 399, 
+	399, 84, 79, 194, 195, 360, 360, 360, 
+	397, 360, 393, 394, 399, 399, 84, 79, 
+	194, 195, 360, 360, 360, 397, 360, 360, 
+	200, 360, 393, 394, 395, 399, 84, 79, 
+	194, 195, 360, 360, 109, 397, 360, 360, 
+	200, 360, 391, 360, 423, 360, 410, 410, 
+	84, 79, 194, 195, 360, 360, 360, 365, 
+	360, 391, 360, 391, 360, 360, 360, 401, 
+	401, 360, 79, 194, 195, 360, 360, 360, 
+	365, 360, 391, 360, 391, 360, 360, 360, 
+	401, 424, 360, 79, 194, 195, 360, 360, 
+	360, 365, 360, 391, 360, 391, 360, 423, 
+	360, 401, 401, 360, 79, 194, 195, 360, 
+	360, 360, 365, 360, 391, 360, 391, 81, 
+	360, 360, 98, 392, 360, 79, 194, 195, 
+	360, 360, 360, 365, 360, 391, 360, 384, 
+	385, 390, 390, 84, 79, 194, 195, 360, 
+	360, 360, 388, 360, 360, 200, 360, 384, 
+	385, 386, 390, 84, 79, 194, 195, 360, 
+	360, 111, 388, 360, 360, 200, 360, 382, 
+	360, 425, 360, 410, 410, 84, 79, 194, 
+	195, 360, 360, 360, 365, 360, 382, 360, 
+	382, 360, 360, 360, 401, 401, 360, 79, 
+	194, 195, 360, 360, 360, 365, 360, 382, 
+	360, 382, 360, 360, 360, 401, 426, 360, 
+	79, 194, 195, 360, 360, 360, 365, 360, 
+	382, 360, 382, 360, 425, 360, 401, 401, 
+	360, 79, 194, 195, 360, 360, 360, 365, 
+	360, 382, 360, 382, 81, 360, 360, 98, 
+	383, 360, 79, 194, 195, 360, 360, 360, 
+	365, 360, 382, 360, 375, 376, 381, 381, 
+	84, 79, 194, 195, 360, 360, 360, 379, 
+	360, 360, 200, 360, 375, 376, 377, 381, 
+	84, 79, 194, 195, 360, 360, 113, 379, 
+	360, 360, 200, 360, 373, 360, 427, 360, 
+	410, 410, 84, 79, 194, 195, 360, 360, 
+	360, 365, 360, 373, 360, 373, 360, 360, 
+	360, 401, 401, 360, 79, 194, 195, 360, 
+	360, 360, 365, 360, 373, 360, 373, 360, 
+	360, 360, 401, 428, 360, 79, 194, 195, 
+	360, 360, 360, 365, 360, 373, 360, 373, 
+	360, 427, 360, 401, 401, 360, 79, 194, 
+	195, 360, 360, 360, 365, 360, 373, 360, 
+	373, 81, 360, 360, 98, 374, 360, 79, 
+	194, 195, 360, 360, 360, 365, 360, 373, 
+	360, 366, 367, 372, 372, 84, 79, 194, 
+	195, 360, 360, 360, 370, 360, 360, 200, 
+	360, 366, 367, 368, 372, 84, 79, 194, 
+	195, 360, 360, 115, 370, 360, 360, 200, 
+	360, 363, 360, 429, 360, 410, 410, 84, 
+	79, 194, 195, 360, 360, 360, 365, 360, 
+	363, 360, 363, 360, 360, 360, 401, 401, 
+	360, 79, 194, 195, 360, 360, 360, 365, 
+	360, 363, 360, 363, 360, 360, 360, 401, 
+	430, 360, 79, 194, 195, 360, 360, 360, 
+	365, 360, 363, 360, 363, 360, 429, 360, 
+	401, 401, 360, 79, 194, 195, 360, 360, 
+	360, 365, 360, 363, 360, 363, 81, 360, 
+	360, 98, 364, 360, 79, 194, 195, 360, 
+	360, 360, 365, 360, 363, 360, 116, 83, 
+	83, 84, 79, 431, 431, 431, 431, 156, 
+	116, 431, 190, 191, 362, 362, 84, 79, 
+	194, 195, 360, 360, 360, 197, 360, 360, 
+	200, 360, 116, 83, 83, 84, 79, 431, 
+	431, 431, 431, 431, 116, 431, 433, 434, 
+	435, 436, 123, 118, 437, 438, 432, 432, 
+	155, 439, 432, 432, 440, 432, 441, 434, 
+	436, 436, 123, 118, 437, 438, 432, 432, 
+	432, 439, 432, 432, 440, 432, 434, 436, 
+	436, 123, 118, 437, 438, 432, 432, 432, 
+	439, 432, 432, 440, 432, 442, 432, 432, 
+	432, 136, 443, 432, 118, 437, 438, 432, 
+	432, 432, 444, 432, 442, 432, 445, 446, 
+	447, 448, 123, 118, 437, 438, 432, 432, 
+	153, 449, 432, 432, 440, 432, 450, 446, 
+	451, 451, 123, 118, 437, 438, 432, 432, 
+	432, 449, 432, 432, 440, 432, 446, 451, 
+	451, 123, 118, 437, 438, 432, 432, 432, 
+	449, 432, 432, 440, 432, 452, 432, 432, 
+	432, 136, 453, 432, 118, 437, 438, 432, 
+	432, 432, 444, 432, 452, 432, 454, 455, 
+	456, 457, 123, 118, 437, 438, 432, 432, 
+	151, 458, 432, 432, 440, 432, 459, 455, 
+	460, 460, 123, 118, 437, 438, 432, 432, 
+	432, 458, 432, 432, 440, 432, 455, 460, 
+	460, 123, 118, 437, 438, 432, 432, 432, 
+	458, 432, 432, 440, 432, 461, 432, 432, 
+	432, 136, 462, 432, 118, 437, 438, 432, 
+	432, 432, 444, 432, 461, 432, 463, 464, 
+	465, 466, 123, 118, 437, 438, 432, 432, 
+	149, 467, 432, 432, 440, 432, 468, 464, 
+	469, 469, 123, 118, 437, 438, 432, 432, 
+	432, 467, 432, 432, 440, 432, 464, 469, 
+	469, 123, 118, 437, 438, 432, 432, 432, 
+	467, 432, 432, 440, 432, 470, 432, 432, 
+	432, 136, 471, 432, 118, 437, 438, 432, 
+	432, 432, 444, 432, 470, 432, 472, 473, 
+	474, 475, 123, 118, 437, 438, 432, 432, 
+	147, 476, 432, 432, 440, 432, 477, 473, 
+	478, 478, 123, 118, 437, 438, 432, 432, 
+	432, 476, 432, 432, 440, 432, 473, 478, 
+	478, 123, 118, 437, 438, 432, 432, 432, 
+	476, 432, 432, 440, 432, 136, 479, 432, 
+	118, 437, 438, 432, 432, 432, 444, 432, 
+	480, 480, 432, 118, 437, 438, 432, 432, 
+	432, 444, 432, 481, 432, 432, 482, 437, 
+	438, 432, 437, 438, 432, 483, 432, 437, 
+	484, 432, 437, 485, 432, 437, 432, 481, 
+	432, 432, 432, 437, 438, 432, 486, 432, 
+	487, 488, 432, 118, 437, 438, 432, 432, 
+	121, 432, 120, 432, 480, 480, 432, 118, 
+	437, 438, 432, 480, 480, 432, 118, 437, 
+	438, 432, 486, 432, 480, 480, 432, 118, 
+	437, 438, 432, 486, 432, 487, 480, 432, 
+	118, 437, 438, 432, 432, 121, 432, 136, 
+	432, 489, 489, 123, 118, 437, 438, 432, 
+	432, 432, 444, 432, 490, 145, 491, 492, 
+	126, 118, 437, 438, 432, 432, 432, 444, 
+	432, 145, 491, 492, 126, 118, 437, 438, 
+	432, 432, 432, 444, 432, 491, 491, 126, 
+	118, 437, 438, 432, 432, 432, 444, 432, 
+	493, 142, 494, 495, 129, 118, 437, 438, 
+	432, 432, 432, 444, 432, 142, 494, 495, 
+	129, 118, 437, 438, 432, 432, 432, 444, 
+	432, 494, 494, 129, 118, 437, 438, 432, 
+	432, 432, 444, 432, 496, 139, 497, 498, 
+	132, 118, 437, 438, 432, 432, 432, 444, 
+	432, 139, 497, 498, 132, 118, 437, 438, 
+	432, 432, 432, 444, 432, 497, 497, 132, 
+	118, 437, 438, 432, 432, 432, 444, 432, 
+	499, 136, 480, 500, 432, 118, 437, 438, 
+	432, 432, 432, 444, 432, 136, 480, 500, 
+	432, 118, 437, 438, 432, 432, 432, 444, 
+	432, 480, 501, 432, 118, 437, 438, 432, 
+	432, 432, 444, 432, 136, 432, 480, 480, 
+	432, 118, 437, 438, 432, 432, 432, 444, 
+	432, 119, 120, 432, 432, 136, 479, 432, 
+	118, 437, 438, 432, 432, 432, 444, 432, 
+	119, 432, 473, 478, 478, 123, 118, 437, 
+	438, 432, 432, 432, 476, 432, 472, 473, 
+	478, 478, 123, 118, 437, 438, 432, 432, 
+	432, 476, 432, 432, 440, 432, 472, 473, 
+	474, 478, 123, 118, 437, 438, 432, 432, 
+	147, 476, 432, 432, 440, 432, 470, 432, 
+	502, 432, 489, 489, 123, 118, 437, 438, 
+	432, 432, 432, 444, 432, 470, 432, 470, 
+	432, 432, 432, 480, 480, 432, 118, 437, 
+	438, 432, 432, 432, 444, 432, 470, 432, 
+	470, 432, 432, 432, 480, 503, 432, 118, 
+	437, 438, 432, 432, 432, 444, 432, 470, 
+	432, 470, 432, 502, 432, 480, 480, 432, 
+	118, 437, 438, 432, 432, 432, 444, 432, 
+	470, 432, 470, 120, 432, 432, 136, 471, 
+	432, 118, 437, 438, 432, 432, 432, 444, 
+	432, 470, 432, 463, 464, 469, 469, 123, 
+	118, 437, 438, 432, 432, 432, 467, 432, 
+	432, 440, 432, 463, 464, 465, 469, 123, 
+	118, 437, 438, 432, 432, 149, 467, 432, 
+	432, 440, 432, 461, 432, 504, 432, 489, 
+	489, 123, 118, 437, 438, 432, 432, 432, 
+	444, 432, 461, 432, 461, 432, 432, 432, 
+	480, 480, 432, 118, 437, 438, 432, 432, 
+	432, 444, 432, 461, 432, 461, 432, 432, 
+	432, 480, 505, 432, 118, 437, 438, 432, 
+	432, 432, 444, 432, 461, 432, 461, 432, 
+	504, 432, 480, 480, 432, 118, 437, 438, 
+	432, 432, 432, 444, 432, 461, 432, 461, 
+	120, 432, 432, 136, 462, 432, 118, 437, 
+	438, 432, 432, 432, 444, 432, 461, 432, 
+	454, 455, 460, 460, 123, 118, 437, 438, 
+	432, 432, 432, 458, 432, 432, 440, 432, 
+	454, 455, 456, 460, 123, 118, 437, 438, 
+	432, 432, 151, 458, 432, 432, 440, 432, 
+	452, 432, 506, 432, 489, 489, 123, 118, 
+	437, 438, 432, 432, 432, 444, 432, 452, 
+	432, 452, 432, 432, 432, 480, 480, 432, 
+	118, 437, 438, 432, 432, 432, 444, 432, 
+	452, 432, 452, 432, 432, 432, 480, 507, 
+	432, 118, 437, 438, 432, 432, 432, 444, 
+	432, 452, 432, 452, 432, 506, 432, 480, 
+	480, 432, 118, 437, 438, 432, 432, 432, 
+	444, 432, 452, 432, 452, 120, 432, 432, 
+	136, 453, 432, 118, 437, 438, 432, 432, 
+	432, 444, 432, 452, 432, 445, 446, 451, 
+	451, 123, 118, 437, 438, 432, 432, 432, 
+	449, 432, 432, 440, 432, 445, 446, 447, 
+	451, 123, 118, 437, 438, 432, 432, 153, 
+	449, 432, 432, 440, 432, 442, 432, 508, 
+	432, 489, 489, 123, 118, 437, 438, 432, 
+	432, 432, 444, 432, 442, 432, 442, 432, 
+	432, 432, 480, 480, 432, 118, 437, 438, 
+	432, 432, 432, 444, 432, 442, 432, 442, 
+	432, 432, 432, 480, 509, 432, 118, 437, 
+	438, 432, 432, 432, 444, 432, 442, 432, 
+	442, 432, 508, 432, 480, 480, 432, 118, 
+	437, 438, 432, 432, 432, 444, 432, 442, 
+	432, 442, 120, 432, 432, 136, 443, 432, 
+	118, 437, 438, 432, 432, 432, 444, 432, 
+	442, 432, 433, 434, 436, 436, 123, 118, 
+	437, 438, 432, 432, 432, 439, 432, 432, 
+	440, 432, 188, 189, 190, 191, 510, 362, 
+	84, 79, 194, 195, 196, 196, 156, 197, 
+	360, 188, 200, 360, 203, 511, 205, 206, 
+	6, 1, 207, 208, 202, 202, 38, 209, 
+	202, 202, 210, 202, 213, 189, 190, 191, 
+	512, 513, 84, 157, 514, 515, 202, 196, 
+	156, 516, 202, 213, 200, 202, 116, 517, 
+	517, 84, 157, 207, 208, 202, 202, 156, 
+	518, 202, 519, 202, 202, 520, 514, 515, 
+	202, 514, 515, 202, 254, 202, 514, 521, 
+	202, 514, 522, 202, 514, 202, 519, 202, 
+	202, 202, 514, 515, 202, 523, 3, 360, 
+	360, 401, 430, 360, 79, 194, 195, 360, 
+	360, 360, 365, 360, 523, 360, 524, 367, 
+	525, 526, 84, 157, 514, 515, 202, 202, 
+	158, 370, 202, 202, 200, 202, 527, 367, 
+	528, 528, 84, 157, 514, 515, 202, 202, 
+	202, 370, 202, 202, 200, 202, 367, 528, 
+	528, 84, 157, 514, 515, 202, 202, 202, 
+	370, 202, 202, 200, 202, 524, 367, 528, 
+	528, 84, 157, 514, 515, 202, 202, 202, 
+	370, 202, 202, 200, 202, 524, 367, 525, 
+	528, 84, 157, 514, 515, 202, 202, 158, 
+	370, 202, 202, 200, 202, 213, 202, 279, 
+	116, 529, 529, 160, 157, 207, 208, 202, 
+	202, 202, 518, 202, 213, 202, 530, 184, 
+	531, 532, 162, 157, 514, 515, 202, 202, 
+	202, 533, 202, 184, 531, 532, 162, 157, 
+	514, 515, 202, 202, 202, 533, 202, 531, 
+	531, 162, 157, 514, 515, 202, 202, 202, 
+	533, 202, 534, 181, 535, 536, 165, 157, 
+	514, 515, 202, 202, 202, 533, 202, 181, 
+	535, 536, 165, 157, 514, 515, 202, 202, 
+	202, 533, 202, 535, 535, 165, 157, 514, 
+	515, 202, 202, 202, 533, 202, 537, 178, 
+	538, 539, 168, 157, 514, 515, 202, 202, 
+	202, 533, 202, 178, 538, 539, 168, 157, 
+	514, 515, 202, 202, 202, 533, 202, 538, 
+	538, 168, 157, 514, 515, 202, 202, 202, 
+	533, 202, 540, 175, 541, 542, 202, 157, 
+	514, 515, 202, 202, 202, 533, 202, 175, 
+	541, 542, 202, 157, 514, 515, 202, 202, 
+	202, 533, 202, 541, 541, 202, 157, 514, 
+	515, 202, 202, 202, 533, 202, 543, 202, 
+	544, 545, 202, 157, 514, 515, 202, 202, 
+	172, 202, 171, 202, 541, 541, 202, 157, 
+	514, 515, 202, 541, 541, 202, 157, 514, 
+	515, 202, 543, 202, 541, 541, 202, 157, 
+	514, 515, 202, 543, 202, 544, 541, 202, 
+	157, 514, 515, 202, 202, 172, 202, 523, 
+	171, 360, 360, 98, 364, 360, 79, 194, 
+	195, 360, 360, 360, 365, 360, 523, 360, 
+	547, 546, 548, 548, 546, 186, 549, 550, 
+	546, 548, 548, 546, 186, 549, 550, 546, 
+	551, 546, 546, 552, 549, 550, 546, 549, 
+	550, 546, 553, 546, 549, 554, 546, 549, 
+	555, 546, 549, 546, 551, 546, 546, 546, 
+	549, 550, 546, 0
 };
 
 static const short _indic_syllable_machine_trans_targs[] = {
 	178, 200, 207, 209, 210, 4, 213, 5, 
 	7, 216, 8, 10, 219, 11, 13, 222, 
 	14, 16, 17, 199, 19, 20, 221, 22, 
-	23, 218, 25, 26, 215, 224, 229, 233, 
-	236, 240, 243, 247, 250, 254, 257, 178, 
-	280, 287, 289, 290, 41, 293, 42, 44, 
-	296, 45, 47, 299, 48, 50, 302, 51, 
-	53, 54, 279, 56, 57, 301, 59, 60, 
-	298, 62, 63, 295, 304, 309, 313, 316, 
-	320, 323, 327, 330, 334, 338, 178, 359, 
-	366, 368, 369, 78, 372, 178, 79, 81, 
-	375, 82, 84, 378, 85, 87, 381, 88, 
-	90, 91, 358, 93, 94, 380, 96, 97, 
-	377, 99, 100, 374, 383, 388, 392, 395, 
-	399, 402, 406, 409, 413, 178, 440, 447, 
-	449, 450, 114, 453, 115, 117, 456, 118, 
-	120, 459, 121, 123, 462, 124, 126, 127, 
-	439, 129, 130, 461, 132, 133, 458, 135, 
-	136, 455, 464, 469, 473, 476, 480, 483, 
-	487, 490, 494, 497, 417, 502, 513, 152, 
-	516, 154, 519, 155, 157, 522, 158, 160, 
-	525, 161, 528, 530, 531, 166, 167, 527, 
-	169, 170, 524, 172, 173, 521, 175, 176, 
-	518, 178, 536, 178, 179, 259, 339, 341, 
-	416, 418, 361, 362, 419, 415, 498, 499, 
-	386, 534, 387, 178, 180, 182, 36, 258, 
-	202, 203, 256, 227, 228, 181, 35, 183, 
-	252, 1, 184, 186, 34, 251, 249, 185, 
-	33, 187, 245, 188, 190, 32, 244, 242, 
-	189, 31, 191, 238, 192, 194, 30, 237, 
-	235, 193, 29, 195, 231, 196, 198, 28, 
-	230, 226, 197, 27, 212, 0, 201, 206, 
-	178, 204, 205, 208, 2, 211, 3, 214, 
-	6, 24, 217, 9, 21, 220, 12, 18, 
-	223, 15, 225, 232, 234, 239, 241, 246, 
-	248, 253, 255, 178, 260, 262, 73, 336, 
-	282, 283, 337, 307, 308, 261, 72, 263, 
-	332, 38, 264, 266, 71, 331, 329, 265, 
-	70, 267, 325, 268, 270, 69, 324, 322, 
-	269, 68, 271, 318, 272, 274, 67, 317, 
-	315, 273, 66, 275, 311, 276, 278, 65, 
-	310, 306, 277, 64, 292, 37, 281, 286, 
-	178, 284, 285, 288, 39, 291, 40, 294, 
-	43, 61, 297, 46, 58, 300, 49, 55, 
-	303, 52, 305, 312, 314, 319, 321, 326, 
-	328, 333, 335, 178, 340, 109, 342, 411, 
-	75, 343, 345, 108, 410, 408, 344, 107, 
-	346, 404, 347, 349, 106, 403, 401, 348, 
-	105, 350, 397, 351, 353, 104, 396, 394, 
-	352, 103, 354, 390, 355, 357, 102, 389, 
-	385, 356, 101, 371, 74, 360, 365, 178, 
-	363, 364, 367, 76, 370, 77, 373, 80, 
-	98, 376, 83, 95, 379, 86, 92, 382, 
-	89, 384, 391, 393, 398, 400, 405, 407, 
-	412, 414, 178, 178, 420, 422, 146, 145, 
-	442, 443, 496, 467, 468, 421, 423, 492, 
-	111, 424, 426, 144, 491, 489, 425, 143, 
-	427, 485, 428, 430, 142, 484, 482, 429, 
-	141, 431, 478, 432, 434, 140, 477, 475, 
-	433, 139, 435, 471, 436, 438, 138, 470, 
-	466, 437, 137, 452, 110, 441, 446, 178, 
-	444, 445, 448, 112, 451, 113, 454, 116, 
-	134, 457, 119, 131, 460, 122, 128, 463, 
-	125, 465, 472, 474, 479, 481, 486, 488, 
-	493, 495, 147, 500, 501, 515, 504, 505, 
-	533, 148, 509, 503, 508, 506, 507, 510, 
-	511, 150, 514, 512, 149, 151, 517, 153, 
-	174, 163, 520, 156, 171, 523, 159, 168, 
-	526, 162, 165, 529, 164, 532, 178, 535, 
-	177, 538, 539, 537, 542, 178, 540, 541
+	23, 218, 25, 26, 215, 224, 228, 232, 
+	235, 239, 242, 246, 249, 253, 256, 178, 
+	279, 286, 288, 289, 41, 292, 42, 44, 
+	295, 45, 47, 298, 48, 50, 301, 51, 
+	53, 54, 278, 56, 57, 300, 59, 60, 
+	297, 62, 63, 294, 303, 307, 311, 314, 
+	318, 321, 325, 328, 332, 336, 178, 357, 
+	364, 366, 367, 78, 370, 178, 79, 81, 
+	373, 82, 84, 376, 85, 87, 379, 88, 
+	90, 91, 356, 93, 94, 378, 96, 97, 
+	375, 99, 100, 372, 381, 385, 389, 392, 
+	396, 399, 403, 406, 410, 178, 437, 444, 
+	446, 447, 114, 450, 115, 117, 453, 118, 
+	120, 456, 121, 123, 459, 124, 126, 127, 
+	436, 129, 130, 458, 132, 133, 455, 135, 
+	136, 452, 461, 465, 469, 472, 476, 479, 
+	483, 486, 490, 493, 414, 498, 509, 152, 
+	512, 154, 515, 155, 157, 518, 158, 160, 
+	521, 161, 524, 526, 527, 166, 167, 523, 
+	169, 170, 520, 172, 173, 517, 175, 176, 
+	514, 178, 532, 178, 179, 258, 337, 339, 
+	413, 415, 359, 360, 416, 412, 494, 495, 
+	384, 530, 178, 180, 182, 36, 257, 202, 
+	203, 255, 227, 181, 35, 183, 251, 1, 
+	184, 186, 34, 250, 248, 185, 33, 187, 
+	244, 188, 190, 32, 243, 241, 189, 31, 
+	191, 237, 192, 194, 30, 236, 234, 193, 
+	29, 195, 230, 196, 198, 28, 229, 226, 
+	197, 27, 212, 0, 201, 206, 178, 204, 
+	205, 208, 2, 211, 3, 214, 6, 24, 
+	217, 9, 21, 220, 12, 18, 223, 15, 
+	225, 231, 233, 238, 240, 245, 247, 252, 
+	254, 178, 259, 261, 73, 334, 281, 282, 
+	335, 306, 260, 72, 262, 330, 38, 263, 
+	265, 71, 329, 327, 264, 70, 266, 323, 
+	267, 269, 69, 322, 320, 268, 68, 270, 
+	316, 271, 273, 67, 315, 313, 272, 66, 
+	274, 309, 275, 277, 65, 308, 305, 276, 
+	64, 291, 37, 280, 285, 178, 283, 284, 
+	287, 39, 290, 40, 293, 43, 61, 296, 
+	46, 58, 299, 49, 55, 302, 52, 304, 
+	310, 312, 317, 319, 324, 326, 331, 333, 
+	178, 338, 109, 340, 408, 75, 341, 343, 
+	108, 407, 405, 342, 107, 344, 401, 345, 
+	347, 106, 400, 398, 346, 105, 348, 394, 
+	349, 351, 104, 393, 391, 350, 103, 352, 
+	387, 353, 355, 102, 386, 383, 354, 101, 
+	369, 74, 358, 363, 178, 361, 362, 365, 
+	76, 368, 77, 371, 80, 98, 374, 83, 
+	95, 377, 86, 92, 380, 89, 382, 388, 
+	390, 395, 397, 402, 404, 409, 411, 178, 
+	178, 417, 419, 146, 145, 439, 440, 492, 
+	464, 418, 420, 488, 111, 421, 423, 144, 
+	487, 485, 422, 143, 424, 481, 425, 427, 
+	142, 480, 478, 426, 141, 428, 474, 429, 
+	431, 140, 473, 471, 430, 139, 432, 467, 
+	433, 435, 138, 466, 463, 434, 137, 449, 
+	110, 438, 443, 178, 441, 442, 445, 112, 
+	448, 113, 451, 116, 134, 454, 119, 131, 
+	457, 122, 128, 460, 125, 462, 468, 470, 
+	475, 477, 482, 484, 489, 491, 147, 496, 
+	497, 511, 500, 501, 529, 148, 505, 499, 
+	504, 502, 503, 506, 507, 150, 510, 508, 
+	149, 151, 513, 153, 174, 163, 516, 156, 
+	171, 519, 159, 168, 522, 162, 165, 525, 
+	164, 528, 178, 531, 177, 534, 535, 533, 
+	538, 178, 536, 537
 };
 
 static const char _indic_syllable_machine_trans_actions[] = {
 	1, 0, 2, 2, 2, 0, 2, 0, 
 	0, 2, 0, 0, 2, 0, 0, 2, 
 	0, 0, 0, 2, 0, 0, 2, 0, 
 	0, 2, 0, 0, 2, 2, 2, 2, 
 	2, 2, 2, 2, 2, 2, 2, 3, 
@@ -1280,61 +1082,61 @@ static const char _indic_syllable_machin
 	2, 0, 0, 2, 0, 0, 2, 0, 
 	0, 2, 2, 2, 2, 2, 2, 2, 
 	2, 2, 2, 2, 6, 0, 8, 0, 
 	2, 0, 2, 0, 0, 2, 0, 0, 
 	2, 0, 2, 2, 2, 0, 0, 2, 
 	0, 0, 2, 0, 0, 2, 0, 0, 
 	2, 9, 0, 12, 2, 2, 6, 2, 
 	13, 13, 0, 0, 2, 2, 6, 2, 
-	6, 2, 6, 14, 2, 2, 0, 2, 
-	0, 0, 2, 2, 2, 2, 0, 2, 
-	2, 0, 2, 2, 0, 2, 2, 2, 
-	0, 2, 2, 2, 2, 0, 2, 2, 
-	2, 0, 2, 2, 2, 2, 0, 2, 
-	2, 2, 0, 2, 2, 2, 2, 0, 
-	2, 2, 2, 0, 2, 0, 0, 0, 
-	15, 0, 0, 2, 0, 2, 0, 2, 
-	0, 0, 2, 0, 0, 2, 0, 0, 
-	2, 0, 2, 2, 2, 2, 2, 2, 
-	2, 2, 2, 16, 2, 2, 0, 2, 
-	0, 0, 2, 2, 2, 2, 0, 2, 
-	2, 0, 2, 2, 0, 2, 2, 2, 
-	0, 2, 2, 2, 2, 0, 2, 2, 
-	2, 0, 2, 2, 2, 2, 0, 2, 
-	2, 2, 0, 2, 2, 2, 2, 0, 
-	2, 2, 2, 0, 2, 0, 0, 0, 
-	17, 0, 0, 2, 0, 2, 0, 2, 
-	0, 0, 2, 0, 0, 2, 0, 0, 
-	2, 0, 2, 2, 2, 2, 2, 2, 
-	2, 2, 2, 18, 6, 0, 6, 6, 
-	0, 6, 2, 0, 6, 2, 6, 0, 
-	6, 6, 6, 2, 0, 6, 2, 6, 
-	0, 6, 6, 6, 2, 0, 6, 2, 
-	6, 0, 6, 6, 6, 2, 0, 6, 
-	2, 6, 0, 6, 0, 0, 0, 19, 
-	0, 0, 2, 0, 2, 0, 2, 0, 
-	0, 2, 0, 0, 2, 0, 0, 2, 
-	0, 2, 2, 2, 2, 2, 2, 2, 
-	2, 2, 20, 21, 2, 2, 0, 0, 
-	0, 0, 2, 2, 2, 2, 2, 2, 
-	0, 2, 2, 0, 2, 2, 2, 0, 
+	6, 2, 14, 2, 2, 0, 2, 0, 
+	0, 2, 2, 2, 0, 2, 2, 0, 
+	2, 2, 0, 2, 2, 2, 0, 2, 
+	2, 2, 2, 0, 2, 2, 2, 0, 
 	2, 2, 2, 2, 0, 2, 2, 2, 
 	0, 2, 2, 2, 2, 0, 2, 2, 
-	2, 0, 2, 2, 2, 2, 0, 2, 
-	2, 2, 0, 2, 0, 0, 0, 22, 
-	0, 0, 2, 0, 2, 0, 2, 0, 
+	2, 0, 2, 0, 0, 0, 15, 0, 
+	0, 2, 0, 2, 0, 2, 0, 0, 
+	2, 0, 0, 2, 0, 0, 2, 0, 
+	2, 2, 2, 2, 2, 2, 2, 2, 
+	2, 16, 2, 2, 0, 2, 0, 0, 
+	2, 2, 2, 0, 2, 2, 0, 2, 
+	2, 0, 2, 2, 2, 0, 2, 2, 
+	2, 2, 0, 2, 2, 2, 0, 2, 
+	2, 2, 2, 0, 2, 2, 2, 0, 
+	2, 2, 2, 2, 0, 2, 2, 2, 
+	0, 2, 0, 0, 0, 17, 0, 0, 
+	2, 0, 2, 0, 2, 0, 0, 2, 
+	0, 0, 2, 0, 0, 2, 0, 2, 
+	2, 2, 2, 2, 2, 2, 2, 2, 
+	18, 6, 0, 6, 6, 0, 6, 2, 
+	0, 6, 2, 6, 0, 6, 6, 6, 
+	2, 0, 6, 2, 6, 0, 6, 6, 
+	6, 2, 0, 6, 2, 6, 0, 6, 
+	6, 6, 2, 0, 6, 2, 6, 0, 
+	6, 0, 0, 0, 19, 0, 0, 2, 
+	0, 2, 0, 2, 0, 0, 2, 0, 
+	0, 2, 0, 0, 2, 0, 2, 2, 
+	2, 2, 2, 2, 2, 2, 2, 20, 
+	21, 2, 2, 0, 0, 0, 0, 2, 
+	2, 2, 2, 2, 0, 2, 2, 0, 
+	2, 2, 2, 0, 2, 2, 2, 2, 
+	0, 2, 2, 2, 0, 2, 2, 2, 
+	2, 0, 2, 2, 2, 0, 2, 2, 
+	2, 2, 0, 2, 2, 2, 0, 2, 
+	0, 0, 0, 22, 0, 0, 2, 0, 
+	2, 0, 2, 0, 0, 2, 0, 0, 
+	2, 0, 0, 2, 0, 2, 2, 2, 
+	2, 2, 2, 2, 2, 2, 0, 0, 
+	8, 2, 0, 0, 2, 0, 2, 0, 
+	0, 0, 0, 8, 8, 0, 8, 8, 
+	0, 0, 2, 0, 0, 0, 2, 0, 
 	0, 2, 0, 0, 2, 0, 0, 2, 
-	0, 2, 2, 2, 2, 2, 2, 2, 
-	2, 2, 0, 0, 8, 2, 0, 0, 
-	2, 0, 2, 0, 0, 0, 0, 8, 
-	8, 0, 8, 8, 0, 0, 2, 0, 
-	0, 0, 2, 0, 0, 2, 0, 0, 
-	2, 0, 0, 2, 0, 2, 23, 2, 
-	0, 0, 0, 0, 0, 24, 0, 0
+	0, 2, 23, 2, 0, 0, 0, 0, 
+	0, 24, 0, 0
 };
 
 static const char _indic_syllable_machine_to_state_actions[] = {
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
@@ -1395,17 +1197,17 @@ static const char _indic_syllable_machin
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0
+	0, 0, 0
 };
 
 static const char _indic_syllable_machine_from_state_actions[] = {
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
@@ -1466,17 +1268,17 @@ static const char _indic_syllable_machin
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0
+	0, 0, 0
 };
 
 static const short _indic_syllable_machine_eof_trans[] = {
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 40, 40, 40, 
@@ -1492,76 +1294,76 @@ static const short _indic_syllable_machi
 	118, 118, 118, 118, 118, 118, 118, 118, 
 	118, 118, 118, 118, 118, 118, 118, 118, 
 	118, 118, 118, 118, 118, 118, 118, 118, 
 	118, 118, 118, 118, 118, 118, 118, 118, 
 	118, 118, 118, 79, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
 	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 186, 0, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 284, 284, 284, 284, 284, 
-	284, 284, 284, 284, 284, 284, 284, 284, 
-	284, 284, 284, 284, 284, 284, 284, 284, 
-	284, 284, 284, 284, 284, 284, 284, 284, 
-	284, 284, 284, 284, 284, 284, 284, 284, 
-	284, 284, 284, 284, 284, 284, 284, 284, 
-	284, 284, 284, 284, 284, 284, 284, 284, 
-	284, 284, 284, 284, 284, 284, 284, 284, 
-	284, 284, 284, 284, 284, 284, 284, 284, 
-	284, 284, 284, 284, 284, 284, 284, 284, 
-	284, 284, 284, 364, 364, 364, 364, 364, 
-	364, 364, 364, 364, 364, 364, 364, 364, 
-	364, 364, 364, 364, 364, 364, 364, 364, 
-	364, 364, 364, 364, 364, 364, 364, 364, 
-	364, 364, 364, 364, 364, 364, 364, 364, 
-	364, 364, 364, 364, 364, 364, 364, 364, 
-	364, 364, 364, 364, 364, 364, 364, 364, 
-	364, 364, 364, 364, 364, 364, 364, 364, 
-	364, 364, 364, 364, 364, 364, 364, 364, 
-	364, 364, 364, 364, 364, 364, 364, 364, 
-	435, 364, 435, 436, 436, 436, 436, 436, 
-	436, 436, 436, 436, 436, 436, 436, 436, 
-	436, 436, 436, 436, 436, 436, 436, 436, 
-	436, 436, 436, 436, 436, 436, 436, 436, 
-	436, 436, 436, 436, 436, 436, 436, 436, 
-	436, 436, 436, 436, 436, 436, 436, 436, 
-	436, 436, 436, 436, 436, 436, 436, 436, 
-	436, 436, 436, 436, 436, 436, 436, 436, 
-	436, 436, 436, 436, 436, 436, 436, 436, 
-	436, 436, 436, 436, 436, 436, 436, 436, 
-	436, 436, 364, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 364, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 204, 204, 204, 
-	204, 204, 204, 204, 204, 364, 551, 551, 
-	551, 551, 551, 551, 551, 551, 551
+	1, 186, 0, 203, 203, 203, 203, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 203, 282, 282, 282, 282, 282, 282, 
+	282, 282, 282, 282, 282, 282, 282, 282, 
+	282, 282, 282, 282, 282, 282, 282, 282, 
+	282, 282, 282, 282, 282, 282, 282, 282, 
+	282, 282, 282, 282, 282, 282, 282, 282, 
+	282, 282, 282, 282, 282, 282, 282, 282, 
+	282, 282, 282, 282, 282, 282, 282, 282, 
+	282, 282, 282, 282, 282, 282, 282, 282, 
+	282, 282, 282, 282, 282, 282, 282, 282, 
+	282, 282, 282, 282, 282, 282, 282, 282, 
+	282, 361, 361, 361, 361, 361, 361, 361, 
+	361, 361, 361, 361, 361, 361, 361, 361, 
+	361, 361, 361, 361, 361, 361, 361, 361, 
+	361, 361, 361, 361, 361, 361, 361, 361, 
+	361, 361, 361, 361, 361, 361, 361, 361, 
+	361, 361, 361, 361, 361, 361, 361, 361, 
+	361, 361, 361, 361, 361, 361, 361, 361, 
+	361, 361, 361, 361, 361, 361, 361, 361, 
+	361, 361, 361, 361, 361, 361, 361, 361, 
+	361, 361, 361, 361, 361, 432, 361, 432, 
+	433, 433, 433, 433, 433, 433, 433, 433, 
+	433, 433, 433, 433, 433, 433, 433, 433, 
+	433, 433, 433, 433, 433, 433, 433, 433, 
+	433, 433, 433, 433, 433, 433, 433, 433, 
+	433, 433, 433, 433, 433, 433, 433, 433, 
+	433, 433, 433, 433, 433, 433, 433, 433, 
+	433, 433, 433, 433, 433, 433, 433, 433, 
+	433, 433, 433, 433, 433, 433, 433, 433, 
+	433, 433, 433, 433, 433, 433, 433, 433, 
+	433, 433, 433, 433, 433, 433, 361, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 361, 203, 203, 203, 203, 203, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 203, 203, 203, 203, 203, 203, 203, 
+	203, 361, 547, 547, 547, 547, 547, 547, 
+	547, 547, 547
 };
 
 static const int indic_syllable_machine_start = 178;
 static const int indic_syllable_machine_first_final = 178;
 static const int indic_syllable_machine_error = -1;
 
 static const int indic_syllable_machine_en_main = 178;
 
 
 #line 36 "hb-ot-shape-complex-indic-machine.rl"
 
 
 
-#line 97 "hb-ot-shape-complex-indic-machine.rl"
+#line 96 "hb-ot-shape-complex-indic-machine.rl"
 
 
 #define found_syllable(syllable_type) \
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \
     for (unsigned int i = last; i < p+1; i++) \
       info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     last = p+1; \
@@ -1571,48 +1373,48 @@ static const int indic_syllable_machine_
 
 static void
 find_syllables (hb_buffer_t *buffer)
 {
   unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED;
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 1580 "hb-ot-shape-complex-indic-machine.hh"
+#line 1382 "hb-ot-shape-complex-indic-machine.hh"
 	{
 	cs = indic_syllable_machine_start;
 	ts = 0;
 	te = 0;
 	act = 0;
 	}
 
-#line 118 "hb-ot-shape-complex-indic-machine.rl"
+#line 117 "hb-ot-shape-complex-indic-machine.rl"
 
 
   p = 0;
   pe = eof = buffer->len;
 
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
-#line 1597 "hb-ot-shape-complex-indic-machine.hh"
+#line 1399 "hb-ot-shape-complex-indic-machine.hh"
 	{
 	int _slen;
 	int _trans;
 	const unsigned char *_keys;
 	const short *_inds;
 	if ( p == pe )
 		goto _test_eof;
 _resume:
 	switch ( _indic_syllable_machine_from_state_actions[cs] ) {
 	case 11:
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 1611 "hb-ot-shape-complex-indic-machine.hh"
+#line 1413 "hb-ot-shape-complex-indic-machine.hh"
 	}
 
 	_keys = _indic_syllable_machine_trans_keys + (cs<<1);
 	_inds = _indic_syllable_machine_indicies + _indic_syllable_machine_index_offsets[cs];
 
 	_slen = _indic_syllable_machine_key_spans[cs];
 	_trans = _inds[ _slen > 0 && _keys[0] <=( info[p].indic_category()) &&
 		( info[p].indic_category()) <= _keys[1] ?
@@ -1625,81 +1427,81 @@ find_syllables (hb_buffer_t *buffer)
 		goto _again;
 
 	switch ( _indic_syllable_machine_trans_actions[_trans] ) {
 	case 2:
 #line 1 "NONE"
 	{te = p+1;}
 	break;
 	case 15:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (consonant_syllable); }}
 	break;
 	case 17:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (vowel_syllable); }}
 	break;
 	case 22:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (standalone_cluster); }}
 	break;
 	case 24:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (symbol_cluster); }}
 	break;
 	case 19:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (broken_cluster); }}
 	break;
 	case 12:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (non_indic_cluster); }}
 	break;
 	case 14:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (consonant_syllable); }}
 	break;
 	case 16:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (vowel_syllable); }}
 	break;
 	case 21:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (standalone_cluster); }}
 	break;
 	case 23:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (symbol_cluster); }}
 	break;
 	case 18:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (broken_cluster); }}
 	break;
 	case 20:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (non_indic_cluster); }}
 	break;
 	case 1:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
 	break;
 	case 3:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
 	break;
 	case 7:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
 	break;
 	case 9:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
 	break;
 	case 4:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
 	break;
 	case 5:
 #line 1 "NONE"
 	{	switch( act ) {
 	case 1:
 	{{p = ((te))-1;} found_syllable (consonant_syllable); }
 	break;
@@ -1710,53 +1512,53 @@ find_syllables (hb_buffer_t *buffer)
 	{{p = ((te))-1;} found_syllable (non_indic_cluster); }
 	break;
 	}
 	}
 	break;
 	case 8:
 #line 1 "NONE"
 	{te = p+1;}
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
 	{act = 1;}
 	break;
 	case 6:
 #line 1 "NONE"
 	{te = p+1;}
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
 	{act = 5;}
 	break;
 	case 13:
 #line 1 "NONE"
 	{te = p+1;}
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
 	{act = 6;}
 	break;
-#line 1734 "hb-ot-shape-complex-indic-machine.hh"
+#line 1536 "hb-ot-shape-complex-indic-machine.hh"
 	}
 
 _again:
 	switch ( _indic_syllable_machine_to_state_actions[cs] ) {
 	case 10:
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 1743 "hb-ot-shape-complex-indic-machine.hh"
+#line 1545 "hb-ot-shape-complex-indic-machine.hh"
 	}
 
 	if ( ++p != pe )
 		goto _resume;
 	_test_eof: {}
 	if ( p == eof )
 	{
 	if ( _indic_syllable_machine_eof_trans[cs] > 0 ) {
 		_trans = _indic_syllable_machine_eof_trans[cs] - 1;
 		goto _eof_trans;
 	}
 	}
 
 	}
 
-#line 127 "hb-ot-shape-complex-indic-machine.rl"
+#line 126 "hb-ot-shape-complex-indic-machine.rl"
 
 }
 
 #endif /* HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH */
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-indic-machine.rl
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-indic-machine.rl
@@ -52,33 +52,32 @@ A    = 10;
 PLACEHOLDER = 11;
 DOTTEDCIRCLE = 12;
 RS    = 13;
 Coeng = 14;
 Repha = 15;
 Ra    = 16;
 CM    = 17;
 Symbol= 18;
-CM2   = 31;
 
 c = (C | Ra);			# is_consonant
 n = ((ZWNJ?.RS)? (N.N?)?);	# is_consonant_modifier
 z = ZWJ|ZWNJ;			# is_joiner
 h = H | Coeng;			# is_halant_or_coeng
 reph = (Ra H | Repha);		# possible reph
 
 cn = c.ZWJ?.n?;
 forced_rakar = ZWJ H ZWJ Ra;
 symbol = Symbol.N?;
 matra_group = z{0,3}.M.N?.(H | forced_rakar)?;
 syllable_tail = (z?.SM.SM?.ZWNJ?)? A{0,3}? VD{0,2};
 place_holder = PLACEHOLDER | DOTTEDCIRCLE;
 halant_group = (z?.h.(ZWJ.N?)?);
 final_halant_group = halant_group | h.ZWNJ;
-medial_group = CM?.CM2?;
+medial_group = CM?;
 halant_or_matra_group = (final_halant_group | (h.ZWJ)? matra_group{0,4}) (Coeng (cn|V))?;
 
 
 consonant_syllable =	Repha? (cn.halant_group){0,4} cn medial_group halant_or_matra_group syllable_tail;
 vowel_syllable =	reph? V.n? (ZWJ | (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail);
 standalone_cluster =	(Repha? PLACEHOLDER | reph? DOTTEDCIRCLE).n? (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail;
 symbol_cluster = 	symbol syllable_tail;
 broken_cluster =	reph? n? (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail;
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-indic-private.hh
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-indic-private.hh
@@ -55,21 +55,20 @@ enum indic_category_t {
   OT_A = 10,
   OT_PLACEHOLDER = 11,
   OT_DOTTEDCIRCLE = 12,
   OT_RS = 13, /* Register Shifter, used in Khmer OT spec. */
   OT_Coeng = 14, /* Khmer-style Virama. */
   OT_Repha = 15, /* Atomically-encoded logical or visual repha. */
   OT_Ra = 16,
   OT_CM = 17,  /* Consonant-Medial. */
-  OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */
-  OT_CM2 = 31 /* Consonant-Medial, second slot. */
+  OT_Symbol = 18 /* Avagraha, etc that take marks (SM,A,VD). */
 };
 
-#define MEDIAL_FLAGS (FLAG (OT_CM) | FLAG (OT_CM2))
+#define MEDIAL_FLAGS (FLAG (OT_CM))
 
 /* Note:
  *
  * We treat Vowels and placeholders as if they were consonants.  This is safe because Vowels
  * cannot happen in a consonant syllable.  The plus side however is, we can call the
  * consonant syllable logic from the vowel syllable function and get it all right! */
 #define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE))
 #define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ))
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-indic-table.cc
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-indic-table.cc
@@ -1,71 +1,71 @@
 /* == Start of generated table == */
 /*
  * The following table is generated by running:
  *
- *   ./gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt
+ *   ./gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-8.0.0.txt
- * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI]
- * # IndicPositionalCategory-8.0.0.txt
- * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI]
- * # Blocks-8.0.0.txt
- * # Date: 2014-11-10, 23:04:00 GMT [KW]
+ * # IndicSyllabicCategory-9.0.0.txt
+ * # Date: 2016-05-21, 02:46:00 GMT [RP]
+ * # IndicPositionalCategory-9.0.0.txt
+ * # Date: 2016-02-25, 00:48:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
  */
 
 #include "hb-ot-shape-complex-indic-private.hh"
 
 
-#define ISC_A	INDIC_SYLLABIC_CATEGORY_AVAGRAHA		/*  13 chars; Avagraha */
-#define ISC_Bi	INDIC_SYLLABIC_CATEGORY_BINDU			/*  60 chars; Bindu */
+#define ISC_A	INDIC_SYLLABIC_CATEGORY_AVAGRAHA		/*  15 chars; Avagraha */
+#define ISC_Bi	INDIC_SYLLABIC_CATEGORY_BINDU			/*  67 chars; Bindu */
 #define ISC_BJN	INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER	/*  20 chars; Brahmi_Joining_Number */
-#define ISC_Ca	INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK	/*  52 chars; Cantillation_Mark */
-#define ISC_C	INDIC_SYLLABIC_CATEGORY_CONSONANT		/* 1805 chars; Consonant */
-#define ISC_CD	INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD		/*   7 chars; Consonant_Dead */
+#define ISC_Ca	INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK	/*  53 chars; Cantillation_Mark */
+#define ISC_C	INDIC_SYLLABIC_CATEGORY_CONSONANT		/* 1907 chars; Consonant */
+#define ISC_CD	INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD		/*  10 chars; Consonant_Dead */
 #define ISC_CF	INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL		/*  62 chars; Consonant_Final */
 #define ISC_CHL	INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER	/*   5 chars; Consonant_Head_Letter */
 #define ISC_CK	INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER	/*   2 chars; Consonant_Killer */
 #define ISC_CM	INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL	/*  22 chars; Consonant_Medial */
-#define ISC_CP	INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER	/*  13 chars; Consonant_Placeholder */
+#define ISC_CP	INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER	/*  16 chars; Consonant_Placeholder */
 #define ISC_CPR	INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA	/*   1 chars; Consonant_Preceding_Repha */
 #define ISC_CPrf	INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED	/*   2 chars; Consonant_Prefixed */
-#define ISC_CS	INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED	/*  61 chars; Consonant_Subjoined */
+#define ISC_CS	INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED	/*  90 chars; Consonant_Subjoined */
 #define ISC_CSR	INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA	/*   4 chars; Consonant_Succeeding_Repha */
 #define ISC_CWS	INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER	/*   4 chars; Consonant_With_Stacker */
 #define ISC_GM	INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK		/*   2 chars; Gemination_Mark */
 #define ISC_IS	INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER	/*   7 chars; Invisible_Stacker */
 #define ISC_ZWJ	INDIC_SYLLABIC_CATEGORY_JOINER			/*   1 chars; Joiner */
 #define ISC_ML	INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER	/*   1 chars; Modifying_Letter */
 #define ISC_ZWNJ	INDIC_SYLLABIC_CATEGORY_NON_JOINER		/*   1 chars; Non_Joiner */
-#define ISC_N	INDIC_SYLLABIC_CATEGORY_NUKTA			/*  23 chars; Nukta */
-#define ISC_Nd	INDIC_SYLLABIC_CATEGORY_NUMBER			/* 420 chars; Number */
+#define ISC_N	INDIC_SYLLABIC_CATEGORY_NUKTA			/*  24 chars; Nukta */
+#define ISC_Nd	INDIC_SYLLABIC_CATEGORY_NUMBER			/* 459 chars; Number */
 #define ISC_NJ	INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER		/*   1 chars; Number_Joiner */
 #define ISC_x	INDIC_SYLLABIC_CATEGORY_OTHER			/*   1 chars; Other */
 #define ISC_PK	INDIC_SYLLABIC_CATEGORY_PURE_KILLER		/*  16 chars; Pure_Killer */
 #define ISC_RS	INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER	/*   2 chars; Register_Shifter */
-#define ISC_SM	INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER	/*  20 chars; Syllable_Modifier */
+#define ISC_SM	INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER	/*  22 chars; Syllable_Modifier */
 #define ISC_TL	INDIC_SYLLABIC_CATEGORY_TONE_LETTER		/*   7 chars; Tone_Letter */
 #define ISC_TM	INDIC_SYLLABIC_CATEGORY_TONE_MARK		/*  42 chars; Tone_Mark */
-#define ISC_V	INDIC_SYLLABIC_CATEGORY_VIRAMA			/*  22 chars; Virama */
-#define ISC_Vs	INDIC_SYLLABIC_CATEGORY_VISARGA			/*  29 chars; Visarga */
+#define ISC_V	INDIC_SYLLABIC_CATEGORY_VIRAMA			/*  24 chars; Virama */
+#define ISC_Vs	INDIC_SYLLABIC_CATEGORY_VISARGA			/*  31 chars; Visarga */
 #define ISC_Vo	INDIC_SYLLABIC_CATEGORY_VOWEL			/*  30 chars; Vowel */
-#define ISC_M	INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT		/* 572 chars; Vowel_Dependent */
-#define ISC_VI	INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT	/* 404 chars; Vowel_Independent */
+#define ISC_M	INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT		/* 602 chars; Vowel_Dependent */
+#define ISC_VI	INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT	/* 431 chars; Vowel_Independent */
 
-#define IMC_B	INDIC_MATRA_CATEGORY_BOTTOM			/* 256 chars; Bottom */
+#define IMC_B	INDIC_MATRA_CATEGORY_BOTTOM			/* 300 chars; Bottom */
 #define IMC_BR	INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT		/*   2 chars; Bottom_And_Right */
-#define IMC_L	INDIC_MATRA_CATEGORY_LEFT			/*  55 chars; Left */
+#define IMC_L	INDIC_MATRA_CATEGORY_LEFT			/*  57 chars; Left */
 #define IMC_LR	INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT		/*  21 chars; Left_And_Right */
 #define IMC_x	INDIC_MATRA_CATEGORY_NOT_APPLICABLE		/*   1 chars; Not_Applicable */
 #define IMC_O	INDIC_MATRA_CATEGORY_OVERSTRUCK			/*  10 chars; Overstruck */
-#define IMC_R	INDIC_MATRA_CATEGORY_RIGHT			/* 249 chars; Right */
-#define IMC_T	INDIC_MATRA_CATEGORY_TOP			/* 324 chars; Top */
+#define IMC_R	INDIC_MATRA_CATEGORY_RIGHT			/* 258 chars; Right */
+#define IMC_T	INDIC_MATRA_CATEGORY_TOP			/* 342 chars; Top */
 #define IMC_TB	INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM		/*  10 chars; Top_And_Bottom */
 #define IMC_TBR	INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT	/*   1 chars; Top_And_Bottom_And_Right */
 #define IMC_TL	INDIC_MATRA_CATEGORY_TOP_AND_LEFT		/*   6 chars; Top_And_Left */
 #define IMC_TLR	INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT	/*   4 chars; Top_And_Left_And_Right */
 #define IMC_TR	INDIC_MATRA_CATEGORY_TOP_AND_RIGHT		/*  13 chars; Top_And_Right */
 #define IMC_VOL	INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT		/*  19 chars; Visual_Order_Left */
 
 #define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M)
@@ -256,17 +256,17 @@ static const INDIC_TABLE_ELEMENT_TYPE in
   /* 0D10 */ _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D28 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D38 */  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(A,x),  _(M,R),  _(M,R),
   /* 0D40 */  _(M,R),  _(M,R),  _(M,R),  _(M,B),  _(M,B),  _(x,x),  _(M,L),  _(M,L),
   /* 0D48 */  _(M,L),  _(x,x), _(M,LR), _(M,LR), _(M,LR),  _(V,T),_(CPR,x),  _(x,x),
-  /* 0D50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),
+  /* 0D50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(CD,x), _(CD,x), _(CD,x),  _(M,R),
   /* 0D58 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(VI,x),
   /* 0D60 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0D68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 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 */
 
@@ -307,648 +307,124 @@ static const INDIC_TABLE_ELEMENT_TYPE in
   /* 1068 */  _(M,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R),  _(C,x),  _(C,x),
   /* 1070 */  _(C,x),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(C,x),  _(C,x),  _(C,x),
   /* 1078 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1080 */  _(C,x),  _(C,x), _(CM,B),  _(M,R),  _(M,L),  _(M,T),  _(M,T), _(TM,R),
   /* 1088 */ _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,B),  _(C,x), _(TM,R),
   /* 1090 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 1098 */ _(Nd,x), _(Nd,x), _(TM,R), _(TM,R),  _(M,R),  _(M,T),  _(x,x),  _(x,x),
 
-#define indic_offset_0x1700u 1496
-
-
-  /* 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), _(PK,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 */
+#define indic_offset_0x1780u 1496
 
-  /* 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), _(PK,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 */ _(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 */ _(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 */  _(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),
   /* 1790 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1798 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 17A0 */  _(C,x),  _(C,x),  _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 17A8 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 17B0 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x),  _(M,R),  _(M,T),
   /* 17B8 */  _(M,T),  _(M,T),  _(M,T),  _(M,B),  _(M,B),  _(M,B), _(M,TL),_(M,TLR),
   /* 17C0 */ _(M,LR),  _(M,L),  _(M,L),  _(M,L), _(M,LR), _(M,LR), _(Bi,T), _(Vs,R),
   /* 17C8 */  _(M,R), _(RS,T), _(RS,T), _(SM,T),_(CSR,T), _(CK,T), _(SM,T), _(SM,T),
   /* 17D0 */ _(SM,T), _(PK,T), _(IS,x), _(SM,T),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 17D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(A,x),  _(x,T),  _(x,x),  _(x,x),
+  /* 17D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(A,x), _(SM,T),  _(x,x),  _(x,x),
   /* 17E0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 17E8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x1900u 1736
-
-
-  /* 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),
-  /* 1910 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1918 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),
-  /* 1920 */  _(M,T),  _(M,T),  _(M,B),  _(M,R),  _(M,R), _(M,TR), _(M,TR),  _(M,T),
-  /* 1928 */  _(M,T), _(CS,R), _(CS,R), _(CS,R),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1930 */ _(CF,R), _(CF,R), _(Bi,B), _(CF,R), _(CF,R), _(CF,R), _(CF,R), _(CF,R),
-  /* 1938 */ _(CF,R), _(CF,B),  _(M,T), _(SM,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1940 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
-  /* 1948 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-
-  /* 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),
-  /* 1960 */  _(C,x),  _(C,x),  _(C,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),
-  /* 1968 */ _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),  _(x,x),  _(x,x),
-  /* 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 */  _(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),
-  /* 1990 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1998 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 19A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 19A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 19B0 */  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),_(M,VOL),_(M,VOL),_(M,VOL),
-  /* 19B8 */  _(M,R),  _(M,R),_(M,VOL),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),
-  /* 19C0 */  _(M,R), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
-  /* 19C8 */ _(TM,R), _(TM,R),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 19D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 19D8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 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 */  _(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,T),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* 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),
-  /* 1A30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1A38 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1A40 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1A48 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 1A50 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x), _(CM,L), _(CM,B), _(CF,R),
-  /* 1A58 */ _(CF,T), _(CF,T), _(CF,T), _(CF,B), _(CF,B), _(CF,B), _(CF,B),  _(x,x),
-  /* 1A60 */ _(IS,x),  _(M,R),  _(M,T),  _(M,R),  _(M,R),  _(M,T),  _(M,T),  _(M,T),
-  /* 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,T), _(TM,T), _(TM,T),
-  /* 1A78 */ _(TM,T), _(TM,T), _(SM,T), _(SM,T), _(SM,T),  _(x,x),  _(x,x), _(SM,B),
-  /* 1A80 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 1A88 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1A90 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 1A98 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x1b00u 2152
-
-
-  /* Balinese */
-
-  /* 1B00 */ _(Bi,T), _(Bi,T), _(Bi,T),_(CSR,T), _(Vs,R), _(VI,x), _(VI,x), _(VI,x),
-  /* 1B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 1B10 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B28 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(N,T),  _(M,R),  _(M,T),  _(M,T),
-  /* 1B38 */  _(M,B),  _(M,B),  _(M,B), _(M,BR), _(M,TB),_(M,TBR),  _(M,L),  _(M,L),
-  /* 1B40 */ _(M,LR), _(M,LR),  _(M,T), _(M,TR),  _(V,R),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B48 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1B50 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 1B58 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1B60 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1B68 */  _(x,x),  _(x,x),  _(x,x),  _(x,T),  _(x,B),  _(x,T),  _(x,T),  _(x,T),
-  /* 1B70 */  _(x,T),  _(x,T),  _(x,T),  _(x,T),  _(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 */ _(Bi,T),_(CSR,T), _(Vs,R), _(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),
-  /* 1B90 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B98 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1BA0 */  _(C,x), _(CS,R), _(CS,B), _(CS,B),  _(M,T),  _(M,B),  _(M,L),  _(M,R),
-  /* 1BA8 */  _(M,T),  _(M,T), _(PK,R), _(IS,x), _(CS,B), _(CS,B),  _(C,x),  _(C,x),
-  /* 1BB0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 1BB8 */ _(Nd,x), _(Nd,x),  _(A,x),  _(C,x),  _(C,x),  _(C,x), _(CF,x), _(CF,x),
-
-  /* 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),
-  /* 1BD0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1BD8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1BE0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(VI,x), _(VI,x),  _(N,T),  _(M,R),
-  /* 1BE8 */  _(M,T),  _(M,T),  _(M,R),  _(M,R),  _(M,R),  _(M,T),  _(M,R),  _(M,T),
-  /* 1BF0 */ _(CF,T), _(CF,T), _(PK,R), _(PK,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 */  _(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),
-  /* 1C10 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1C18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1C20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(CS,R), _(CS,R),  _(M,R),  _(M,L),
-  /* 1C28 */  _(M,L), _(M,TL),  _(M,R),  _(M,R),  _(M,B), _(CF,T), _(CF,T), _(CF,T),
-  /* 1C30 */ _(CF,T), _(CF,T), _(CF,T), _(CF,T), _(Bi,L), _(Bi,L), _(SM,T),  _(N,B),
-  /* 1C38 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1C40 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 1C48 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
-
-#define indic_offset_0x1cd0u 2488
+#define indic_offset_0x1cd0u 1608
 
 
   /* Vedic Extensions */
 
   /* 1CD0 */ _(Ca,T), _(Ca,T), _(Ca,T),  _(x,x), _(Ca,O), _(Ca,B), _(Ca,B), _(Ca,B),
   /* 1CD8 */ _(Ca,B), _(Ca,B), _(Ca,T), _(Ca,T), _(Ca,B), _(Ca,B), _(Ca,B), _(Ca,B),
   /* 1CE0 */ _(Ca,T), _(Ca,R),  _(x,O),  _(x,O),  _(x,O),  _(x,O),  _(x,O),  _(x,O),
   /* 1CE8 */  _(x,O),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,B),  _(x,x),  _(x,x),
   /* 1CF0 */  _(x,x),  _(x,x), _(Vs,x), _(Vs,x), _(Ca,T),  _(x,x),  _(x,x),  _(x,x),
   /* 1CF8 */ _(Ca,x), _(Ca,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x2008u 2536
+#define indic_offset_0x2008u 1656
 
 
   /* General Punctuation */
 
   /* 2008 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),_(ZWNJ,x),_(ZWJ,x),  _(x,x),  _(x,x),
   /* 2010 */ _(CP,x), _(CP,x), _(CP,x), _(CP,x), _(CP,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x2070u 2552
+#define indic_offset_0x2070u 1672
 
 
   /* Superscripts and Subscripts */
 
   /* 2070 */  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(SM,x),  _(x,x),  _(x,x),  _(x,x),
   /* 2078 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 2080 */  _(x,x),  _(x,x), _(SM,x), _(SM,x), _(SM,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0xa800u 2576
-
-
-  /* Syloti Nagri */
-
-  /* A800 */ _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x), _(PK,T),  _(C,x),
-  /* A808 */  _(C,x),  _(C,x),  _(C,x), _(Bi,T),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A810 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 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),
-  /* 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 */
+#define indic_offset_0xa8e0u 1696
 
-  /* 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),
-  /* A850 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A858 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(Vo,x), _(Vo,x),
-  /* A860 */ _(Vo,x), _(Vo,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(Vo,x), _(CS,x),
-  /* A868 */ _(CS,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 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 */ _(Bi,R), _(Vs,R), _(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),
-  /* A890 */ _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A898 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A8A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A8A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A8B0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(CF,R),  _(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 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* A8D8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* Devanagari Extended */
 
   /* A8E0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
   /* A8E8 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
   /* A8F0 */ _(Ca,T), _(Ca,T),  _(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 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* A908 */ _(Nd,x), _(Nd,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),
-  /* 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,B), _(TM,B), _(TM,B),  _(x,x),  _(x,x),
-
-  /* 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),
-  /* A940 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,B),
-  /* A948 */  _(M,B),  _(M,B),  _(M,T),  _(M,B),  _(M,B),  _(M,B),  _(M,B), _(CF,T),
-  /* A950 */ _(CF,T), _(CF,T), _(CF,R), _(PK,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),
-  /* 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 */
+#define indic_offset_0xa9e0u 1720
 
-  /* A980 */ _(Bi,T), _(Bi,T),_(CSR,T), _(Vs,R), _(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),
-  /* A990 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A998 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A9A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A9A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A9B0 */  _(C,x),  _(C,x),  _(C,x),  _(N,T),  _(M,R),  _(M,R),  _(M,T),  _(M,T),
-  /* A9B8 */  _(M,B),  _(M,B),  _(M,L),  _(M,L),  _(M,T), _(CS,R), _(CM,R), _(CM,R),
-  /* 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 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* A9D8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* Myanmar Extended-B */
 
   /* A9E0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,T),  _(x,x),  _(C,x),
   /* A9E8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* A9F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* A9F8 */ _(Nd,x), _(Nd,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),
 
-  /* Cham */
+#define indic_offset_0xaa60u 1752
 
-  /* 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),
-  /* AA10 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA28 */  _(C,x),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(M,B),  _(M,T),  _(M,L),
-  /* AA30 */  _(M,L),  _(M,T),  _(M,B), _(CM,R), _(CM,L), _(CM,B), _(CM,B),  _(x,x),
-  /* AA38 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* AA40 */ _(CF,x), _(CF,x), _(CF,x), _(CF,T), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
-  /* AA48 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,T), _(CF,R),  _(x,x),  _(x,x),
-  /* AA50 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* AA58 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* 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),
+  /* AA70 */  _(x,x),  _(C,x),  _(C,x),  _(C,x), _(CP,x), _(CP,x), _(CP,x),  _(x,x),
   /* AA78 */  _(x,x),  _(x,x),  _(C,x), _(TM,R), _(TM,T), _(TM,R),  _(C,x),  _(C,x),
 
-  /* 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),
-  /* AA90 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA98 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AAA0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AAA8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AAB0 */  _(M,T),  _(M,R),  _(M,T),  _(M,T),  _(M,B),_(M,VOL),_(M,VOL),  _(M,T),
-  /* AAB8 */  _(M,T),_(M,VOL),  _(M,R),_(M,VOL),_(M,VOL),  _(M,R),  _(M,T), _(TM,T),
-  /* AAC0 */ _(TL,x), _(TM,T), _(TL,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* AAC8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 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 */ _(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,R), _(IS,x),  _(x,x),
-
-#define indic_offset_0xabc0u 3336
-
-
-  /* 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),
-  /* ABD0 */  _(C,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 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,R), _(PK,B),  _(x,x),  _(x,x),
-  /* ABF0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* ABF8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x10a00u 3400
-
-
-  /* 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),  _(M,B), _(Bi,B), _(Vs,T),
-  /* 10A10 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 10A18 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 10A20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 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 */  _(N,T),  _(N,B),  _(N,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(IS,x),
-  /* 10A40 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-
-#define indic_offset_0x11000u 3472
-
-
-  /* Brahmi */
-
-  /* 11000 */ _(Bi,R), _(Bi,T), _(Vs,R),_(CWS,x),_(CWS,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11008 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11010 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11018 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11020 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11028 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 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),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),
-  /* 11058 */_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),
-  /* 11060 */_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x), _(Nd,x), _(Nd,x),
-  /* 11068 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,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), _(NJ,x),
-
-  /* Kaithi */
-
-  /* 11080 */ _(Bi,T), _(Bi,T), _(Vs,R), _(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),
-  /* 11090 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11098 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 110A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 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,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x11100u 3664
-
-
-  /* Chakma */
-
-  /* 11100 */ _(Bi,T), _(Bi,T), _(Vs,T), _(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),
-  /* 11110 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11118 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 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), _(IS,x), _(PK,T),  _(x,x), _(Nd,x), _(Nd,x),
-  /* 11138 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,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),
-
-  /* Mahajani */
-
-  /* 11150 */ _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11158 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11160 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11168 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11170 */  _(C,x),  _(C,x),  _(C,x),  _(N,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11178 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Sharada */
-
-  /* 11180 */ _(Bi,T), _(Bi,T), _(Vs,R), _(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),
-  /* 11190 */ _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11198 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 111A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 111A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 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),_(CPrf,x),_(CPrf,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 111C8 */  _(x,x),  _(x,x),  _(N,x),  _(M,T),  _(M,B),  _(x,x),  _(x,x),  _(x,x),
-  /* 111D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 111D8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Sinhala Archaic Numbers */
-
-  /* 111E0 */  _(x,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 111E8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 111F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 111F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Khojki */
-
-  /* 11200 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11208 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11210 */  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11218 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11220 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11228 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,R),  _(M,R),  _(M,R),  _(M,B),
-  /* 11230 */  _(M,T),  _(M,T), _(M,TR), _(M,TR), _(Bi,T),  _(V,R),  _(N,T), _(GM,T),
-
-#define indic_offset_0x11280u 3976
-
-
-  /* Multani */
-
-  /* 11280 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),
-  /* 11288 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),
-  /* 11290 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11298 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),
-  /* 112A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 112A8 */  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Khudawadi */
-
-  /* 112B0 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 112B8 */ _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 112C0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 112C8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 112D0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 112D8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(Bi,T),
-  /* 112E0 */  _(M,R),  _(M,L),  _(M,R),  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),
-  /* 112E8 */  _(M,T),  _(N,B), _(PK,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 112F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 112F8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Grantha */
-
-  /* 11300 */ _(Bi,x), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11308 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x), _(VI,x),
-  /* 11310 */ _(VI,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11318 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11320 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11328 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11330 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11338 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,x),  _(A,x),  _(M,R),  _(M,R),
-  /* 11340 */  _(M,T),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(x,x),  _(x,x),  _(M,L),
-  /* 11348 */  _(M,L),  _(x,x),  _(x,x), _(M,LR), _(M,LR),  _(V,R),  _(x,x),  _(x,x),
-  /* 11350 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),
-  /* 11358 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11360 */ _(VI,x), _(VI,x),  _(M,R),  _(M,R),  _(x,x),  _(x,x), _(Ca,T), _(Ca,T),
-  /* 11368 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),  _(x,x),  _(x,x),  _(x,x),
-  /* 11370 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x11480u 4224
-
-
-  /* Tirhuta */
-
-  /* 11480 */  _(x,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11488 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),
-  /* 11490 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11498 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 114A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 114A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 114B0 */  _(M,R),  _(M,L),  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(M,B),
-  /* 114B8 */  _(M,B),  _(M,L),  _(M,T), _(M,TL), _(M,LR),  _(M,R), _(M,LR), _(Bi,T),
-  /* 114C0 */ _(Bi,T), _(Vs,R),  _(V,B),  _(N,B),  _(A,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 114C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 114D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 114D8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x11580u 4320
-
-
-  /* Siddham */
-
-  /* 11580 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11588 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),
-  /* 11590 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11598 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 115A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 115A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,R),
-  /* 115B0 */  _(M,L),  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(x,x),  _(x,x),
-  /* 115B8 */  _(M,L), _(M,TL), _(M,LR),_(M,TLR), _(Bi,T), _(Bi,T), _(Vs,R),  _(V,B),
-  /* 115C0 */  _(N,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 115C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 115D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 115D8 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x),
-  /* 115E0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 115E8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 115F0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 115F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Modi */
-
-  /* 11600 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11608 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),
-  /* 11610 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11618 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11620 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11628 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11630 */  _(M,R),  _(M,R),  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(M,B),
-  /* 11638 */  _(M,B),  _(M,T),  _(M,T),  _(M,R),  _(M,R), _(Bi,T), _(Vs,R),  _(V,B),
-  /* 11640 */  _(M,T),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11648 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11650 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 11658 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11660 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11668 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11670 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11678 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* 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),
-  /* 11690 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11698 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 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,T), _(Vs,R),  _(M,T),  _(M,L),  _(M,R),
-  /* 116B0 */  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(V,R),  _(N,B),
-  /* 116B8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 116C0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 116C8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 116D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 116D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 116E0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 116E8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 116F0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 116F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Ahom */
-
-  /* 11700 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11708 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11710 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11718 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x), _(CM,B), _(CM,x), _(CM,T),
-  /* 11720 */  _(M,R),  _(M,R),  _(M,T),  _(M,T),  _(M,B),  _(M,B),  _(M,L),  _(M,T),
-  /* 11728 */  _(M,B),  _(M,T),  _(M,T), _(PK,T),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11730 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 11738 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-}; /* Table items: 4768; occupancy: 72% */
+}; /* Table items: 1784; occupancy: 69% */
 
 INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u)
 {
   switch (u >> 12)
   {
     case 0x0u:
       if (hb_in_range (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
       if (hb_in_range (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u];
       if (hb_in_range (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
       if (unlikely (u == 0x00A0u)) return _(CP,x);
       break;
 
     case 0x1u:
       if (hb_in_range (u, 0x1000u, 0x109Fu)) return indic_table[u - 0x1000u + indic_offset_0x1000u];
-      if (hb_in_range (u, 0x1700u, 0x17EFu)) return indic_table[u - 0x1700u + indic_offset_0x1700u];
-      if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return indic_table[u - 0x1900u + indic_offset_0x1900u];
-      if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return indic_table[u - 0x1B00u + indic_offset_0x1b00u];
+      if (hb_in_range (u, 0x1780u, 0x17EFu)) return indic_table[u - 0x1780u + indic_offset_0x1780u];
       if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
       break;
 
     case 0x2u:
       if (hb_in_range (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
       if (hb_in_range (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u];
       if (unlikely (u == 0x25CCu)) return _(CP,x);
       break;
 
     case 0xAu:
-      if (hb_in_range (u, 0xA800u, 0xAAF7u)) return indic_table[u - 0xA800u + indic_offset_0xa800u];
-      if (hb_in_range (u, 0xABC0u, 0xABFFu)) return indic_table[u - 0xABC0u + indic_offset_0xabc0u];
-      break;
-
-    case 0x10u:
-      if (hb_in_range (u, 0x10A00u, 0x10A47u)) return indic_table[u - 0x10A00u + indic_offset_0x10a00u];
-      break;
-
-    case 0x11u:
-      if (hb_in_range (u, 0x11000u, 0x110BFu)) return indic_table[u - 0x11000u + indic_offset_0x11000u];
-      if (hb_in_range (u, 0x11100u, 0x11237u)) return indic_table[u - 0x11100u + indic_offset_0x11100u];
-      if (hb_in_range (u, 0x11280u, 0x11377u)) return indic_table[u - 0x11280u + indic_offset_0x11280u];
-      if (hb_in_range (u, 0x11480u, 0x114DFu)) return indic_table[u - 0x11480u + indic_offset_0x11480u];
-      if (hb_in_range (u, 0x11580u, 0x1173Fu)) return indic_table[u - 0x11580u + indic_offset_0x11580u];
+      if (hb_in_range (u, 0xA8E0u, 0xA8F7u)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u];
+      if (hb_in_range (u, 0xA9E0u, 0xA9FFu)) return indic_table[u - 0xA9E0u + indic_offset_0xa9e0u];
+      if (hb_in_range (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u];
       break;
 
     default:
       break;
   }
   return _(x,x);
 }
 
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-indic.cc
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-indic.cc
@@ -195,28 +195,20 @@ set_indic_properties (hb_glyph_info_t &i
   /* The following take marks in standalone clusters, similar to Avagraha. */
   else if (unlikely (hb_in_ranges (u, 0xA8F2u, 0xA8F7u,
 				      0x1CE9u, 0x1CECu,
 				      0x1CEEu, 0x1CF1u)))
   {
     cat = OT_Symbol;
     ASSERT_STATIC ((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol);
   }
-  else if (unlikely (u == 0x17DDu)) /* https://github.com/roozbehp/unicode-data/issues/2 */
-  {
-    cat = OT_M;
-    pos = POS_ABOVE_C;
-  }
   else if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
   else if (unlikely (hb_in_range (u, 0x2010u, 0x2011u)))
 				    cat = OT_PLACEHOLDER;
   else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
-  else if (unlikely (u == 0xA982u)) cat = OT_SM; /* Javanese repha. */
-  else if (unlikely (u == 0xA9BEu)) cat = OT_CM2; /* Javanese medial ya. */
-  else if (unlikely (u == 0xA9BDu)) { cat = OT_M; pos = POS_POST_C; } /* Javanese vocalic r. */
 
 
   /*
    * Re-assign position.
    */
 
   if ((FLAG_SAFE (cat) & CONSONANT_FLAGS))
   {
@@ -272,50 +264,43 @@ enum reph_mode_t {
   REPH_MODE_EXPLICIT,  /* Reph formed out of initial Ra,H,ZWJ sequence. */
   REPH_MODE_VIS_REPHA, /* Encoded Repha character, no reordering needed. */
   REPH_MODE_LOG_REPHA  /* Encoded Repha character, needs reordering. */
 };
 enum blwf_mode_t {
   BLWF_MODE_PRE_AND_POST, /* Below-forms feature applied to pre-base and post-base. */
   BLWF_MODE_POST_ONLY     /* Below-forms feature applied to post-base only. */
 };
-enum pref_len_t {
-  PREF_LEN_1 = 1,
-  PREF_LEN_2 = 2,
-  PREF_LEN_DONT_CARE = PREF_LEN_2
-};
 struct indic_config_t
 {
   hb_script_t     script;
   bool            has_old_spec;
   hb_codepoint_t  virama;
   base_position_t base_pos;
   reph_position_t reph_pos;
   reph_mode_t     reph_mode;
   blwf_mode_t     blwf_mode;
-  pref_len_t      pref_len;
 };
 
 static const indic_config_t indic_configs[] =
 {
   /* Default.  Should be first. */
-  {HB_SCRIPT_INVALID,	false,      0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_1},
-  {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_BENGALI,	true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB,  REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_GURMUKHI,	true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_GUJARATI,	true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_ORIYA,	true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_TAMIL,	true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
-  {HB_SCRIPT_TELUGU,	true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY,    PREF_LEN_2},
-  {HB_SCRIPT_KANNADA,	true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY,    PREF_LEN_2},
-  {HB_SCRIPT_MALAYALAM,	true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
+  {HB_SCRIPT_INVALID,	false,      0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_BENGALI,	true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB,  REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_GURMUKHI,	true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_GUJARATI,	true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_ORIYA,	true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_TAMIL,	true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_TELUGU,	true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY},
+  {HB_SCRIPT_KANNADA,	true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY},
+  {HB_SCRIPT_MALAYALAM,	true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST},
   {HB_SCRIPT_SINHALA,	false,0x0DCAu,BASE_POS_LAST_SINHALA,
-						     REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_KHMER,	false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
-  {HB_SCRIPT_JAVANESE,	false,0xA9C0u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_1},
+						     REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_KHMER,	false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST},
 };
 
 
 
 /*
  * Indic shaper.
  */
 
@@ -583,22 +568,18 @@ consonant_position_from_face (const indi
    * to work. */
   hb_codepoint_t glyphs[3] = {virama, consonant, virama};
   if (indic_plan->blwf.would_substitute (glyphs  , 2, face) ||
       indic_plan->blwf.would_substitute (glyphs+1, 2, face))
     return POS_BELOW_C;
   if (indic_plan->pstf.would_substitute (glyphs  , 2, face) ||
       indic_plan->pstf.would_substitute (glyphs+1, 2, face))
     return POS_POST_C;
-  unsigned int pref_len = indic_plan->config->pref_len;
-  if ((pref_len == PREF_LEN_2 &&
-       (indic_plan->pref.would_substitute (glyphs  , 2, face) ||
-        indic_plan->pref.would_substitute (glyphs+1, 2, face)))
-   || (pref_len == PREF_LEN_1 &&
-       indic_plan->pref.would_substitute (glyphs+1, 1, face)))
+  if (indic_plan->pref.would_substitute (glyphs  , 2, face) ||
+      indic_plan->pref.would_substitute (glyphs+1, 2, face))
     return POS_POST_C;
   return POS_BASE_C;
 }
 
 
 enum syllable_type_t {
   consonant_syllable,
   vowel_syllable,
@@ -1094,20 +1075,19 @@ initial_reordering_consonant_syllable (c
 	  (i + 2 == base ||
 	   info[i+2].indic_category() != OT_ZWJ))
       {
 	info[i  ].mask |= indic_plan->mask_array[BLWF];
 	info[i+1].mask |= indic_plan->mask_array[BLWF];
       }
   }
 
-  unsigned int pref_len = indic_plan->config->pref_len;
+  unsigned int pref_len = 2;
   if (indic_plan->mask_array[PREF] && base + pref_len < end)
   {
-    assert (1 <= pref_len && pref_len <= 2);
     /* Find a Halant,Ra sequence and mark it for pre-base reordering processing. */
     for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) {
       hb_codepoint_t glyphs[2];
       for (unsigned int j = 0; j < pref_len; j++)
         glyphs[j] = info[i + j].codepoint;
       if (indic_plan->pref.would_substitute (glyphs, pref_len, face))
       {
 	for (unsigned int j = 0; j < pref_len; j++)
@@ -1307,17 +1287,17 @@ final_reordering_syllable (const hb_ot_s
 
   bool try_pref = !!indic_plan->mask_array[PREF];
 
   /* Find base again */
   unsigned int base;
   for (base = start; base < end; base++)
     if (info[base].indic_position() >= POS_BASE_C)
     {
-      if (try_pref && base + 1 < end && indic_plan->config->pref_len == 2)
+      if (try_pref && base + 1 < end)
       {
 	for (unsigned int i = base + 1; i < end; i++)
 	  if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
 	  {
 	    if (!(_hb_glyph_info_substituted (&info[i]) &&
 		  _hb_glyph_info_ligated_and_didnt_multiply (&info[i])))
 	    {
 	      /* Ok, this was a 'pref' candidate but didn't form any.
@@ -1589,31 +1569,28 @@ final_reordering_syllable (const hb_ot_s
   /*   o Reorder pre-base reordering consonants:
    *
    *     If a pre-base reordering consonant is found, reorder it according to
    *     the following rules:
    */
 
   if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */
   {
-    unsigned int pref_len = indic_plan->config->pref_len;
     for (unsigned int i = base + 1; i < end; i++)
       if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
       {
 	/*       1. Only reorder a glyph produced by substitution during application
 	 *          of the <pref> feature. (Note that a font may shape a Ra consonant with
 	 *          the feature generally but block it in certain contexts.)
 	 */
         /* Note: We just check that something got substituted.  We don't check that
 	 * the <pref> feature actually did it...
 	 *
-	 * If pref len is longer than one, then only reorder if it ligated.  If
-	 * pref len is one, only reorder if it didn't ligate with other things. */
-	if (_hb_glyph_info_substituted (&info[i]) &&
-	    ((pref_len == 1) ^ _hb_glyph_info_ligated_and_didnt_multiply (&info[i])))
+	 * Reorder pref only if it ligated. */
+	if (_hb_glyph_info_ligated_and_didnt_multiply (&info[i]))
 	{
 	  /*
 	   *       2. Try to find a target position the same way as for pre-base matra.
 	   *          If it is found, reorder pre-base consonant glyph.
 	   *
 	   *       3. If position is not found, reorder immediately before main
 	   *          consonant.
 	   */
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-myanmar.cc
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-myanmar.cc
@@ -244,16 +244,21 @@ set_myanmar_properties (hb_glyph_info_t 
     case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du:
     case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu:
       cat = (indic_category_t) OT_SM;
       break;
 
     case 0x104Au: case 0x104Bu:
       cat = (indic_category_t) OT_P;
       break;
+
+    case 0xAA74u: case 0xAA75u: case 0xAA76u:
+      /* https://github.com/roozbehp/unicode-data/issues/3 */
+      cat = (indic_category_t) OT_C;
+      break;
   }
 
   if (cat == OT_M)
   {
     switch ((int) pos)
     {
       case POS_PRE_C:	cat = (indic_category_t) OT_VPre;
 			pos = POS_PRE_M;                  break;
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-private.hh
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-private.hh
@@ -236,19 +236,16 @@ hb_ot_shape_complex_categorize (const hb
     case HB_SCRIPT_MALAYALAM:
     case HB_SCRIPT_ORIYA:
     case HB_SCRIPT_TAMIL:
     case HB_SCRIPT_TELUGU:
 
     /* Unicode-3.0 additions */
     case HB_SCRIPT_SINHALA:
 
-    /* Unicode-5.2 additions */
-    case HB_SCRIPT_JAVANESE:
-
       /* If the designer designed the font for the 'DFLT' script,
        * use the default shaper.  Otherwise, use the specific shaper.
        * Note that for some simple scripts, there may not be *any*
        * GSUB/GPOS needed, so there may be no scripts found! */
       if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T'))
 	return &_hb_ot_complex_shaper_default;
       else
 	return &_hb_ot_complex_shaper_indic;
@@ -311,17 +308,17 @@ hb_ot_shape_complex_categorize (const hb
     case HB_SCRIPT_KAYAH_LI:
     case HB_SCRIPT_LEPCHA:
     case HB_SCRIPT_REJANG:
     case HB_SCRIPT_SAURASHTRA:
     case HB_SCRIPT_SUNDANESE:
 
     /* Unicode-5.2 additions */
     case HB_SCRIPT_EGYPTIAN_HIEROGLYPHS:
-    //case HB_SCRIPT_JAVANESE:
+    case HB_SCRIPT_JAVANESE:
     case HB_SCRIPT_KAITHI:
     case HB_SCRIPT_MEETEI_MAYEK:
     case HB_SCRIPT_TAI_THAM:
     case HB_SCRIPT_TAI_VIET:
 
     /* Unicode-6.0 additions */
     case HB_SCRIPT_BATAK:
     case HB_SCRIPT_BRAHMI:
@@ -340,16 +337,25 @@ hb_ot_shape_complex_categorize (const hb
     case HB_SCRIPT_MAHAJANI:
     //case HB_SCRIPT_MANICHAEAN:
     case HB_SCRIPT_MODI:
     case HB_SCRIPT_PAHAWH_HMONG:
     //case HB_SCRIPT_PSALTER_PAHLAVI:
     case HB_SCRIPT_SIDDHAM:
     case HB_SCRIPT_TIRHUTA:
 
+    /* Unicode-8.0 additions */
+    case HB_SCRIPT_AHOM:
+    //case HB_SCRIPT_MULTANI:
+
+    /* Unicode-9.0 additions */
+    case HB_SCRIPT_BHAIKSUKI:
+    case HB_SCRIPT_MARCHEN:
+    case HB_SCRIPT_NEWA:
+
       /* If the designer designed the font for the 'DFLT' script,
        * use the default shaper.  Otherwise, use the specific shaper.
        * Note that for some simple scripts, there may not be *any*
        * GSUB/GPOS needed, so there may be no scripts found! */
       if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T'))
 	return &_hb_ot_complex_shaper_default;
       else
 	return &_hb_ot_complex_shaper_use;
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-use-machine.hh
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-use-machine.hh
@@ -31,345 +31,272 @@
 #ifndef HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
 #define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
 
 #include "hb-private.hh"
 
 
 #line 38 "hb-ot-shape-complex-use-machine.hh"
 static const unsigned char _use_syllable_machine_trans_keys[] = {
-	0u, 0u, 4u, 4u, 1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 
-	8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 
-	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
-	8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 
+	1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, 
+	8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
+	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, 
+	4u, 4u, 13u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 
 	8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
-	8u, 39u, 12u, 21u, 12u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 
-	8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
-	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, 
+	8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, 
 	42u, 42u, 0
 };
 
 static const char _use_syllable_machine_key_spans[] = {
-	0, 1, 1, 40, 1, 32, 32, 1, 
-	32, 32, 32, 19, 19, 19, 32, 32, 
-	32, 32, 32, 32, 32, 32, 32, 32, 
-	32, 32, 32, 1, 32, 32, 19, 19, 
+	1, 40, 1, 32, 32, 1, 32, 32, 
+	32, 19, 19, 19, 32, 32, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 9, 
+	1, 1, 32, 32, 32, 32, 19, 19, 
 	19, 32, 32, 32, 32, 32, 32, 32, 
-	32, 10, 2, 32, 32, 32, 32, 19, 
-	19, 19, 32, 32, 32, 32, 32, 32, 
-	32, 32, 32, 32, 39, 32, 22, 2, 
+	32, 32, 32, 1, 39, 32, 22, 2, 
 	1
 };
 
 static const short _use_syllable_machine_index_offsets[] = {
-	0, 0, 2, 4, 45, 47, 80, 113, 
-	115, 148, 181, 214, 234, 254, 274, 307, 
-	340, 373, 406, 439, 472, 505, 538, 571, 
-	604, 637, 670, 703, 705, 738, 771, 791, 
-	811, 831, 864, 897, 930, 963, 996, 1029, 
-	1062, 1095, 1106, 1109, 1142, 1175, 1208, 1241, 
-	1261, 1281, 1301, 1334, 1367, 1400, 1433, 1466, 
-	1499, 1532, 1565, 1598, 1631, 1671, 1704, 1727, 
-	1730
+	0, 2, 43, 45, 78, 111, 113, 146, 
+	179, 212, 232, 252, 272, 305, 338, 371, 
+	404, 437, 470, 503, 536, 569, 602, 635, 
+	645, 647, 649, 682, 715, 748, 781, 801, 
+	821, 841, 874, 907, 940, 973, 1006, 1039, 
+	1072, 1105, 1138, 1171, 1173, 1213, 1246, 1269, 
+	1272
 };
 
 static const char _use_syllable_machine_indicies[] = {
-	1, 0, 3, 2, 4, 5, 6, 
-	4, 1, 5, 8, 8, 7, 8, 8, 
-	3, 9, 8, 8, 8, 4, 4, 10, 
-	11, 8, 8, 12, 13, 14, 15, 16, 
-	17, 18, 12, 19, 20, 21, 22, 23, 
-	24, 8, 25, 26, 27, 8, 29, 28, 
-	31, 30, 30, 32, 33, 30, 30, 30, 
-	30, 30, 30, 30, 30, 34, 35, 36, 
-	37, 38, 39, 40, 41, 35, 42, 34, 
-	43, 44, 45, 46, 30, 47, 48, 49, 
-	30, 31, 30, 30, 32, 33, 30, 30, 
-	30, 30, 30, 30, 30, 30, 50, 35, 
-	36, 37, 38, 39, 40, 41, 35, 42, 
-	43, 43, 44, 45, 46, 30, 47, 48, 
-	49, 30, 32, 51, 31, 30, 30, 32, 
-	33, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 35, 36, 37, 38, 39, 40, 
-	41, 35, 42, 43, 43, 44, 45, 46, 
-	30, 47, 48, 49, 30, 31, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 35, 36, 37, 38, 39, 
-	30, 30, 30, 30, 30, 30, 44, 45, 
-	46, 30, 47, 48, 49, 30, 31, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 36, 37, 38, 
-	39, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 47, 48, 49, 30, 31, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 37, 
-	38, 39, 30, 31, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 38, 39, 30, 31, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 39, 30, 31, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 37, 38, 39, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	47, 48, 49, 30, 31, 30, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 37, 38, 39, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 48, 49, 30, 31, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 37, 38, 39, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 49, 30, 31, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 36, 37, 38, 
-	39, 30, 30, 30, 30, 30, 30, 44, 
-	45, 46, 30, 47, 48, 49, 30, 31, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 30, 36, 37, 
-	38, 39, 30, 30, 30, 30, 30, 30, 
-	30, 45, 46, 30, 47, 48, 49, 30, 
-	31, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 36, 
-	37, 38, 39, 30, 30, 30, 30, 30, 
-	30, 30, 30, 46, 30, 47, 48, 49, 
-	30, 31, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 35, 
-	36, 37, 38, 39, 30, 41, 35, 30, 
-	30, 30, 44, 45, 46, 30, 47, 48, 
-	49, 30, 31, 30, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	35, 36, 37, 38, 39, 30, 30, 35, 
-	30, 30, 30, 44, 45, 46, 30, 47, 
-	48, 49, 30, 31, 30, 30, 30, 30, 
-	30, 30, 30, 30, 30, 30, 30, 30, 
-	30, 35, 36, 37, 38, 39, 40, 41, 
-	35, 30, 30, 30, 44, 45, 46, 30, 
-	47, 48, 49, 30, 31, 30, 30, 32, 
-	33, 30, 30, 30, 30, 30, 30, 30, 
-	30, 30, 35, 36, 37, 38, 39, 40, 
-	41, 35, 42, 30, 43, 44, 45, 46, 
-	30, 47, 48, 49, 30, 31, 30, 30, 
-	32, 33, 30, 30, 30, 30, 30, 30, 
-	30, 30, 30, 35, 36, 37, 38, 39, 
-	40, 41, 35, 42, 34, 43, 44, 45, 
-	46, 30, 47, 48, 49, 30, 53, 52, 
-	52, 54, 55, 52, 52, 52, 52, 52, 
-	52, 52, 52, 56, 52, 57, 58, 59, 
-	60, 61, 62, 57, 63, 56, 64, 52, 
-	52, 52, 52, 65, 66, 67, 52, 53, 
-	52, 52, 54, 55, 52, 52, 52, 52, 
-	52, 52, 52, 52, 68, 52, 57, 58, 
-	59, 60, 61, 62, 57, 63, 64, 64, 
-	52, 52, 52, 52, 65, 66, 67, 52, 
-	54, 51, 53, 52, 52, 54, 55, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	52, 57, 58, 59, 60, 61, 62, 57, 
-	63, 64, 64, 52, 52, 52, 52, 65, 
-	66, 67, 52, 53, 52, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	52, 52, 57, 58, 59, 60, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	65, 66, 67, 52, 53, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	52, 52, 52, 52, 58, 59, 60, 52, 
-	53, 52, 52, 52, 52, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	52, 59, 60, 52, 53, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 60, 52, 
-	53, 52, 52, 52, 52, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	58, 59, 60, 52, 52, 52, 52, 52, 
-	52, 52, 52, 52, 52, 65, 66, 67, 
-	52, 53, 52, 52, 52, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	52, 58, 59, 60, 52, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 66, 
-	67, 52, 53, 52, 52, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	52, 52, 58, 59, 60, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	52, 67, 52, 53, 52, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	52, 52, 57, 58, 59, 60, 52, 62, 
-	57, 52, 52, 52, 52, 52, 52, 52, 
-	65, 66, 67, 52, 53, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	52, 52, 52, 57, 58, 59, 60, 52, 
-	52, 57, 52, 52, 52, 52, 52, 52, 
-	52, 65, 66, 67, 52, 53, 52, 52, 
-	52, 52, 52, 52, 52, 52, 52, 52, 
-	52, 52, 52, 52, 57, 58, 59, 60, 
-	61, 62, 57, 52, 52, 52, 52, 52, 
-	52, 52, 65, 66, 67, 52, 53, 52, 
-	52, 54, 55, 52, 52, 52, 52, 52, 
-	52, 52, 52, 52, 52, 57, 58, 59, 
-	60, 61, 62, 57, 63, 52, 64, 52, 
-	52, 52, 52, 65, 66, 67, 52, 53, 
-	52, 52, 54, 55, 52, 52, 52, 52, 
-	52, 52, 52, 52, 52, 52, 57, 58, 
-	59, 60, 61, 62, 57, 63, 56, 64, 
-	52, 52, 52, 52, 65, 66, 67, 52, 
-	70, 71, 69, 69, 69, 69, 69, 69, 
-	69, 72, 69, 70, 71, 69, 7, 73, 
-	73, 3, 9, 73, 73, 73, 73, 73, 
-	73, 73, 73, 74, 12, 13, 14, 15, 
-	16, 17, 18, 12, 19, 21, 21, 22, 
-	23, 24, 73, 25, 26, 27, 73, 7, 
-	73, 73, 3, 9, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 12, 13, 14, 
-	15, 16, 17, 18, 12, 19, 21, 21, 
-	22, 23, 24, 73, 25, 26, 27, 73, 
-	7, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 12, 13, 
-	14, 15, 16, 73, 73, 73, 73, 73, 
-	73, 22, 23, 24, 73, 25, 26, 27, 
-	73, 7, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	13, 14, 15, 16, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 25, 26, 
-	27, 73, 7, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 14, 15, 16, 73, 7, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 15, 
-	16, 73, 7, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 16, 73, 7, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 14, 15, 
-	16, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 25, 26, 27, 73, 7, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 14, 
-	15, 16, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 26, 27, 73, 
-	7, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	14, 15, 16, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 27, 
-	73, 7, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	13, 14, 15, 16, 73, 73, 73, 73, 
-	73, 73, 22, 23, 24, 73, 25, 26, 
-	27, 73, 7, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	73, 13, 14, 15, 16, 73, 73, 73, 
-	73, 73, 73, 73, 23, 24, 73, 25, 
-	26, 27, 73, 7, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 13, 14, 15, 16, 73, 73, 
-	73, 73, 73, 73, 73, 73, 24, 73, 
-	25, 26, 27, 73, 7, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 12, 13, 14, 15, 16, 73, 
-	18, 12, 73, 73, 73, 22, 23, 24, 
-	73, 25, 26, 27, 73, 7, 73, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 12, 13, 14, 15, 16, 
-	73, 73, 12, 73, 73, 73, 22, 23, 
-	24, 73, 25, 26, 27, 73, 7, 73, 
-	73, 73, 73, 73, 73, 73, 73, 73, 
-	73, 73, 73, 73, 12, 13, 14, 15, 
-	16, 17, 18, 12, 73, 73, 73, 22, 
-	23, 24, 73, 25, 26, 27, 73, 7, 
-	73, 73, 3, 9, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 12, 13, 14, 
-	15, 16, 17, 18, 12, 19, 73, 21, 
-	22, 23, 24, 73, 25, 26, 27, 73, 
-	5, 6, 73, 73, 5, 73, 73, 7, 
-	73, 73, 3, 9, 73, 73, 73, 73, 
-	73, 73, 73, 73, 73, 12, 13, 14, 
-	15, 16, 17, 18, 12, 19, 20, 21, 
-	22, 23, 24, 73, 25, 26, 27, 73, 
-	7, 73, 73, 3, 9, 73, 73, 73, 
-	73, 73, 73, 73, 73, 73, 12, 13, 
-	14, 15, 16, 17, 18, 12, 19, 20, 
-	21, 22, 23, 24, 73, 25, 26, 27, 
-	73, 76, 75, 75, 75, 75, 75, 75, 
-	75, 75, 75, 75, 75, 75, 75, 75, 
-	75, 75, 75, 75, 75, 76, 77, 75, 
-	76, 77, 75, 77, 75, 0
+	1, 0, 2, 3, 4, 2, 5, 3, 
+	4, 4, 6, 4, 4, 1, 7, 4, 
+	4, 4, 2, 2, 8, 9, 4, 4, 
+	10, 11, 12, 13, 14, 15, 16, 10, 
+	17, 18, 19, 20, 21, 22, 4, 23, 
+	24, 25, 4, 27, 26, 29, 28, 28, 
+	30, 31, 28, 28, 28, 28, 28, 28, 
+	28, 28, 32, 33, 34, 35, 36, 37, 
+	38, 39, 33, 40, 32, 41, 42, 43, 
+	44, 28, 45, 46, 47, 28, 29, 28, 
+	28, 30, 31, 28, 28, 28, 28, 28, 
+	28, 28, 28, 48, 33, 34, 35, 36, 
+	37, 38, 39, 33, 40, 41, 41, 42, 
+	43, 44, 28, 45, 46, 47, 28, 30, 
+	49, 29, 28, 28, 30, 31, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 33, 
+	34, 35, 36, 37, 38, 39, 33, 40, 
+	41, 41, 42, 43, 44, 28, 45, 46, 
+	47, 28, 29, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	33, 34, 35, 36, 37, 28, 28, 28, 
+	28, 28, 28, 42, 43, 44, 28, 45, 
+	46, 47, 28, 29, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 34, 35, 36, 37, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	45, 46, 47, 28, 29, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 35, 36, 37, 28, 
+	29, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 36, 37, 28, 29, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 37, 28, 
+	29, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	35, 36, 37, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 45, 46, 47, 
+	28, 29, 28, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 35, 36, 37, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 46, 
+	47, 28, 29, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 35, 36, 37, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 47, 28, 29, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 34, 35, 36, 37, 28, 28, 
+	28, 28, 28, 28, 42, 43, 44, 28, 
+	45, 46, 47, 28, 29, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 28, 34, 35, 36, 37, 28, 
+	28, 28, 28, 28, 28, 28, 43, 44, 
+	28, 45, 46, 47, 28, 29, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 34, 35, 36, 37, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	44, 28, 45, 46, 47, 28, 29, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 33, 34, 35, 36, 
+	37, 28, 39, 33, 28, 28, 28, 42, 
+	43, 44, 28, 45, 46, 47, 28, 29, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 33, 34, 35, 
+	36, 37, 28, 28, 33, 28, 28, 28, 
+	42, 43, 44, 28, 45, 46, 47, 28, 
+	29, 28, 28, 28, 28, 28, 28, 28, 
+	28, 28, 28, 28, 28, 28, 33, 34, 
+	35, 36, 37, 38, 39, 33, 28, 28, 
+	28, 42, 43, 44, 28, 45, 46, 47, 
+	28, 29, 28, 28, 30, 31, 28, 28, 
+	28, 28, 28, 28, 28, 28, 28, 33, 
+	34, 35, 36, 37, 38, 39, 33, 40, 
+	28, 41, 42, 43, 44, 28, 45, 46, 
+	47, 28, 29, 28, 28, 30, 31, 28, 
+	28, 28, 28, 28, 28, 28, 28, 28, 
+	33, 34, 35, 36, 37, 38, 39, 33, 
+	40, 32, 41, 42, 43, 44, 28, 45, 
+	46, 47, 28, 51, 50, 50, 50, 50, 
+	50, 50, 50, 52, 50, 5, 53, 51, 
+	50, 6, 54, 54, 1, 55, 54, 54, 
+	54, 54, 54, 54, 54, 54, 56, 10, 
+	11, 12, 13, 14, 15, 16, 10, 17, 
+	19, 19, 20, 21, 22, 54, 23, 24, 
+	25, 54, 6, 54, 54, 1, 55, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	10, 11, 12, 13, 14, 15, 16, 10, 
+	17, 19, 19, 20, 21, 22, 54, 23, 
+	24, 25, 54, 6, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 10, 11, 12, 13, 14, 54, 54, 
+	54, 54, 54, 54, 20, 21, 22, 54, 
+	23, 24, 25, 54, 6, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 11, 12, 13, 14, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 23, 24, 25, 54, 6, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 12, 13, 14, 
+	54, 6, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 13, 14, 54, 6, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 14, 
+	54, 6, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 12, 13, 14, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 23, 24, 
+	25, 54, 6, 54, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 12, 13, 14, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	24, 25, 54, 6, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 12, 13, 14, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 25, 54, 6, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 11, 12, 13, 14, 54, 
+	54, 54, 54, 54, 54, 20, 21, 22, 
+	54, 23, 24, 25, 54, 6, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 54, 11, 12, 13, 14, 
+	54, 54, 54, 54, 54, 54, 54, 21, 
+	22, 54, 23, 24, 25, 54, 6, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 11, 12, 13, 
+	14, 54, 54, 54, 54, 54, 54, 54, 
+	54, 22, 54, 23, 24, 25, 54, 6, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 10, 11, 12, 
+	13, 14, 54, 16, 10, 54, 54, 54, 
+	20, 21, 22, 54, 23, 24, 25, 54, 
+	6, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 10, 11, 
+	12, 13, 14, 54, 54, 10, 54, 54, 
+	54, 20, 21, 22, 54, 23, 24, 25, 
+	54, 6, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 54, 54, 54, 54, 10, 
+	11, 12, 13, 14, 15, 16, 10, 54, 
+	54, 54, 20, 21, 22, 54, 23, 24, 
+	25, 54, 6, 54, 54, 1, 55, 54, 
+	54, 54, 54, 54, 54, 54, 54, 54, 
+	10, 11, 12, 13, 14, 15, 16, 10, 
+	17, 54, 19, 20, 21, 22, 54, 23, 
+	24, 25, 54, 1, 57, 3, 54, 54, 
+	54, 3, 54, 54, 6, 54, 54, 1, 
+	55, 54, 54, 54, 54, 54, 54, 54, 
+	54, 54, 10, 11, 12, 13, 14, 15, 
+	16, 10, 17, 18, 19, 20, 21, 22, 
+	54, 23, 24, 25, 54, 6, 54, 54, 
+	1, 55, 54, 54, 54, 54, 54, 54, 
+	54, 54, 54, 10, 11, 12, 13, 14, 
+	15, 16, 10, 17, 18, 19, 20, 21, 
+	22, 54, 23, 24, 25, 54, 59, 58, 
+	58, 58, 58, 58, 58, 58, 58, 58, 
+	58, 58, 58, 58, 58, 58, 58, 58, 
+	58, 58, 59, 60, 58, 59, 60, 58, 
+	60, 58, 0
 };
 
 static const char _use_syllable_machine_trans_targs[] = {
-	3, 41, 3, 43, 4, 5, 25, 3, 
-	0, 2, 60, 62, 45, 46, 47, 48, 
-	49, 56, 57, 58, 61, 59, 53, 54, 
-	55, 50, 51, 52, 3, 3, 3, 3, 
-	6, 7, 24, 9, 10, 11, 12, 13, 
-	20, 21, 22, 23, 17, 18, 19, 14, 
-	15, 16, 8, 3, 3, 3, 26, 27, 
-	40, 29, 30, 31, 32, 36, 37, 38, 
-	39, 33, 34, 35, 28, 3, 3, 1, 
-	42, 3, 44, 3, 63, 64
+	1, 26, 2, 3, 1, 23, 1, 43, 
+	44, 46, 28, 29, 30, 31, 32, 39, 
+	40, 41, 45, 42, 36, 37, 38, 33, 
+	34, 35, 1, 1, 1, 1, 4, 5, 
+	22, 7, 8, 9, 10, 11, 18, 19, 
+	20, 21, 15, 16, 17, 12, 13, 14, 
+	6, 1, 1, 24, 25, 1, 1, 0, 
+	27, 1, 1, 47, 48
 };
 
 static const char _use_syllable_machine_trans_actions[] = {
-	1, 2, 3, 4, 0, 0, 0, 7, 
-	0, 0, 4, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 4, 4, 0, 0, 
-	0, 0, 0, 0, 8, 9, 10, 11, 
+	1, 2, 0, 0, 5, 0, 6, 0, 
+	2, 0, 0, 0, 0, 0, 0, 0, 
+	0, 0, 2, 2, 0, 0, 0, 0, 
+	0, 0, 7, 8, 9, 10, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 12, 13, 14, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 15, 16, 0, 
-	2, 17, 4, 18, 0, 0
+	0, 11, 12, 0, 0, 13, 14, 0, 
+	2, 15, 16, 0, 0
 };
 
 static const char _use_syllable_machine_to_state_actions[] = {
-	0, 0, 0, 5, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 3, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0
 };
 
 static const char _use_syllable_machine_from_state_actions[] = {
-	0, 0, 0, 6, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
+	0, 4, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0
 };
 
 static const short _use_syllable_machine_eof_trans[] = {
-	0, 1, 3, 0, 29, 31, 31, 52, 
-	31, 31, 31, 31, 31, 31, 31, 31, 
-	31, 31, 31, 31, 31, 31, 31, 31, 
-	31, 53, 53, 52, 53, 53, 53, 53, 
-	53, 53, 53, 53, 53, 53, 53, 53, 
-	53, 70, 70, 74, 74, 74, 74, 74, 
-	74, 74, 74, 74, 74, 74, 74, 74, 
-	74, 74, 74, 74, 74, 74, 76, 76, 
-	76
+	1, 0, 27, 29, 29, 50, 29, 29, 
+	29, 29, 29, 29, 29, 29, 29, 29, 
+	29, 29, 29, 29, 29, 29, 29, 51, 
+	54, 51, 55, 55, 55, 55, 55, 55, 
+	55, 55, 55, 55, 55, 55, 55, 55, 
+	55, 55, 55, 58, 55, 55, 59, 59, 
+	59
 };
 
-static const int use_syllable_machine_start = 3;
-static const int use_syllable_machine_first_final = 3;
-static const int use_syllable_machine_error = 0;
+static const int use_syllable_machine_start = 1;
+static const int use_syllable_machine_first_final = 1;
+static const int use_syllable_machine_error = -1;
 
-static const int use_syllable_machine_en_main = 3;
+static const int use_syllable_machine_en_main = 1;
 
 
 #line 38 "hb-ot-shape-complex-use-machine.rl"
 
 
 
-#line 145 "hb-ot-shape-complex-use-machine.rl"
+#line 138 "hb-ot-shape-complex-use-machine.rl"
 
 
 #define found_syllable(syllable_type) \
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \
     for (unsigned int i = last; i < p+1; i++) \
       info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     last = p+1; \
@@ -379,50 +306,48 @@ static const int use_syllable_machine_en
 
 static void
 find_syllables (hb_buffer_t *buffer)
 {
   unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED;
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 388 "hb-ot-shape-complex-use-machine.hh"
+#line 315 "hb-ot-shape-complex-use-machine.hh"
 	{
 	cs = use_syllable_machine_start;
 	ts = 0;
 	te = 0;
 	act = 0;
 	}
 
-#line 166 "hb-ot-shape-complex-use-machine.rl"
+#line 159 "hb-ot-shape-complex-use-machine.rl"
 
 
   p = 0;
   pe = eof = buffer->len;
 
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
-#line 405 "hb-ot-shape-complex-use-machine.hh"
+#line 332 "hb-ot-shape-complex-use-machine.hh"
 	{
 	int _slen;
 	int _trans;
 	const unsigned char *_keys;
 	const char *_inds;
 	if ( p == pe )
 		goto _test_eof;
-	if ( cs == 0 )
-		goto _out;
 _resume:
 	switch ( _use_syllable_machine_from_state_actions[cs] ) {
-	case 6:
+	case 4:
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 421 "hb-ot-shape-complex-use-machine.hh"
+#line 346 "hb-ot-shape-complex-use-machine.hh"
 	}
 
 	_keys = _use_syllable_machine_trans_keys + (cs<<1);
 	_inds = _use_syllable_machine_indicies + _use_syllable_machine_index_offsets[cs];
 
 	_slen = _use_syllable_machine_key_spans[cs];
 	_trans = _inds[ _slen > 0 && _keys[0] <=( info[p].use_category()) &&
 		( info[p].use_category()) <= _keys[1] ?
@@ -434,115 +359,92 @@ find_syllables (hb_buffer_t *buffer)
 	if ( _use_syllable_machine_trans_actions[_trans] == 0 )
 		goto _again;
 
 	switch ( _use_syllable_machine_trans_actions[_trans] ) {
 	case 2:
 #line 1 "NONE"
 	{te = p+1;}
 	break;
-	case 9:
+	case 8:
+#line 127 "hb-ot-shape-complex-use-machine.rl"
+	{te = p+1;{ found_syllable (independent_cluster); }}
+	break;
+	case 10:
+#line 129 "hb-ot-shape-complex-use-machine.rl"
+	{te = p+1;{ found_syllable (standard_cluster); }}
+	break;
+	case 6:
+#line 133 "hb-ot-shape-complex-use-machine.rl"
+	{te = p+1;{ found_syllable (broken_cluster); }}
+	break;
+	case 5:
 #line 134 "hb-ot-shape-complex-use-machine.rl"
-	{te = p+1;{ found_syllable (independent_cluster); }}
+	{te = p+1;{ found_syllable (non_cluster); }}
+	break;
+	case 7:
+#line 127 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (independent_cluster); }}
 	break;
 	case 11:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
-	{te = p+1;{ found_syllable (consonant_cluster); }}
-	break;
-	case 14:
-#line 137 "hb-ot-shape-complex-use-machine.rl"
-	{te = p+1;{ found_syllable (vowel_cluster); }}
-	break;
-	case 16:
-#line 138 "hb-ot-shape-complex-use-machine.rl"
-	{te = p+1;{ found_syllable (number_joiner_terminated_cluster); }}
-	break;
-	case 7:
-#line 141 "hb-ot-shape-complex-use-machine.rl"
-	{te = p+1;{ found_syllable (broken_cluster); }}
-	break;
-	case 8:
-#line 134 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (independent_cluster); }}
-	break;
-	case 12:
-#line 135 "hb-ot-shape-complex-use-machine.rl"
+#line 128 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
 	break;
-	case 10:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (consonant_cluster); }}
+	case 9:
+#line 129 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (standard_cluster); }}
 	break;
 	case 13:
-#line 137 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (vowel_cluster); }}
+#line 130 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
 	break;
-	case 15:
-#line 139 "hb-ot-shape-complex-use-machine.rl"
+	case 12:
+#line 131 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (numeral_cluster); }}
 	break;
-	case 18:
-#line 140 "hb-ot-shape-complex-use-machine.rl"
+	case 16:
+#line 132 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (symbol_cluster); }}
 	break;
-	case 17:
-#line 141 "hb-ot-shape-complex-use-machine.rl"
+	case 14:
+#line 133 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (broken_cluster); }}
 	break;
+	case 15:
+#line 134 "hb-ot-shape-complex-use-machine.rl"
+	{te = p;p--;{ found_syllable (non_cluster); }}
+	break;
 	case 1:
-#line 139 "hb-ot-shape-complex-use-machine.rl"
-	{{p = ((te))-1;}{ found_syllable (numeral_cluster); }}
-	break;
-	case 3:
-#line 1 "NONE"
-	{	switch( act ) {
-	case 0:
-	{{cs = 0; goto _again;}}
+#line 133 "hb-ot-shape-complex-use-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
 	break;
-	case 8:
-	{{p = ((te))-1;} found_syllable (broken_cluster); }
-	break;
-	}
-	}
-	break;
-	case 4:
-#line 1 "NONE"
-	{te = p+1;}
-#line 141 "hb-ot-shape-complex-use-machine.rl"
-	{act = 8;}
-	break;
-#line 513 "hb-ot-shape-complex-use-machine.hh"
+#line 420 "hb-ot-shape-complex-use-machine.hh"
 	}
 
 _again:
 	switch ( _use_syllable_machine_to_state_actions[cs] ) {
-	case 5:
+	case 3:
 #line 1 "NONE"
 	{ts = 0;}
-#line 1 "NONE"
-	{act = 0;}
 	break;
-#line 524 "hb-ot-shape-complex-use-machine.hh"
+#line 429 "hb-ot-shape-complex-use-machine.hh"
 	}
 
-	if ( cs == 0 )
-		goto _out;
 	if ( ++p != pe )
 		goto _resume;
 	_test_eof: {}
 	if ( p == eof )
 	{
 	if ( _use_syllable_machine_eof_trans[cs] > 0 ) {
 		_trans = _use_syllable_machine_eof_trans[cs] - 1;
 		goto _eof_trans;
 	}
 	}
 
-	_out: {}
 	}
 
-#line 175 "hb-ot-shape-complex-use-machine.rl"
+#line 168 "hb-ot-shape-complex-use-machine.rl"
 
 }
 
 #undef found_syllable
 
 #endif /* HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH */
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-use-machine.rl
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-use-machine.rl
@@ -39,17 +39,16 @@
 
 %%{
 
 # Same order as enum use_category_t.  Not sure how to avoid duplication.
 
 O	= 0; # OTHER
 
 B	= 1; # BASE
-IV	= 2; # BASE_VOWEL
 IND	= 3; # BASE_IND
 N	= 4; # BASE_NUM
 GB	= 5; # BASE_OTHER
 CGJ	= 6; # CGJ
 #F	= 7; # CONS_FINAL
 FM	= 8; # CONS_FINAL_MOD
 #M	= 9; # CONS_MED
 #CM	= 10; # CONS_MOD
@@ -91,59 +90,53 @@ SMBlw	= 42; # SYM_MOD_BELOW
 
 consonant_modifiers = CMAbv* CMBlw* ((H B | SUB) VS? CMAbv? CMBlw*)*;
 medial_consonants = MPre? MAbv? MBlw? MPst?;
 dependent_vowels = VPre* VAbv* VBlw* VPst*;
 vowel_modifiers = VMPre* VMAbv* VMBlw* VMPst*;
 final_consonants = FAbv* FBlw* FPst* FM?;
 
 virama_terminated_cluster =
-	R? (B | GB | IV) VS?
+	R? (B | GB) VS?
 	consonant_modifiers
 	H
 ;
-consonant_cluster =
+standard_cluster =
 	R? (B | GB) VS?
 	consonant_modifiers
 	medial_consonants
 	dependent_vowels
 	vowel_modifiers
 	final_consonants
 ;
-vowel_cluster =
-	R? (IV) VS?
-	consonant_modifiers
-	medial_consonants
-	vowel_modifiers
-	final_consonants
-;
 
 broken_cluster =
 	R?
 	consonant_modifiers
 	medial_consonants
 	dependent_vowels
 	vowel_modifiers
 	final_consonants
 ;
 
-number_joiner_terminated_cluster = N VS? (HN N VS?)* H;
+number_joiner_terminated_cluster = N VS? (HN N VS?)* HN;
 numeral_cluster = N VS? (HN N VS?)*;
 symbol_cluster = S VS? SMAbv* SMBlw*;
 independent_cluster = (IND | O | Rsv | WJ) VS?;
+other = any;
 
 main := |*
 	independent_cluster			=> { found_syllable (independent_cluster); };
 	virama_terminated_cluster		=> { found_syllable (virama_terminated_cluster); };
-	consonant_cluster			=> { found_syllable (consonant_cluster); };
-	vowel_cluster				=> { found_syllable (vowel_cluster); };
+	standard_cluster			=> { found_syllable (standard_cluster); };
 	number_joiner_terminated_cluster	=> { found_syllable (number_joiner_terminated_cluster); };
 	numeral_cluster				=> { found_syllable (numeral_cluster); };
 	symbol_cluster				=> { found_syllable (symbol_cluster); };
 	broken_cluster				=> { found_syllable (broken_cluster); };
+	other					=> { found_syllable (non_cluster); };
 *|;
 
 
 }%%
 
 #define found_syllable(syllable_type) \
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-use-private.hh
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-use-private.hh
@@ -41,17 +41,16 @@
  * https://www.microsoft.com/typography/OpenTypeDev/USE/intro.htm
  */
 /* Note: This enum is duplicated in the -machine.rl source file.
  * Not sure how to avoid duplication. */
 enum use_category_t {
   USE_O		= 0,	/* OTHER */
 
   USE_B		= 1,	/* BASE */
-  USE_IV	= 2,	/* BASE_VOWEL */
   USE_IND	= 3,	/* BASE_IND */
   USE_N		= 4,	/* BASE_NUM */
   USE_GB	= 5,	/* BASE_OTHER */
   USE_CGJ	= 6,	/* CGJ */
 //  USE_F		= 7,	/* CONS_FINAL */
   USE_FM	= 8,	/* CONS_FINAL_MOD */
 //  USE_M		= 9,	/* CONS_MED */
 //  USE_CM	= 10,	/* CONS_MOD */
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-use-table.cc
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-use-table.cc
@@ -1,35 +1,34 @@
 /* == Start of generated table == */
 /*
  * The following table is generated by running:
  *
  *   ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-8.0.0.txt
- * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI]
- * # IndicPositionalCategory-8.0.0.txt
- * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI]
- * # Blocks-8.0.0.txt
- * # Date: 2014-11-10, 23:04:00 GMT [KW]
+ * # IndicSyllabicCategory-9.0.0.txt
+ * # Date: 2016-05-21, 02:46:00 GMT [RP]
+ * # IndicPositionalCategory-9.0.0.txt
+ * # Date: 2016-02-25, 00:48:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
  * UnicodeData.txt does not have a header.
  */
 
 #include "hb-ot-shape-complex-use-private.hh"
 
 #define B	USE_B	/* BASE */
 #define CGJ	USE_CGJ	/* CGJ */
 #define FM	USE_FM	/* CONS_FINAL_MOD */
 #define GB	USE_GB	/* BASE_OTHER */
 #define H	USE_H	/* HALANT */
 #define HN	USE_HN	/* HALANT_NUM */
 #define IND	USE_IND	/* BASE_IND */
-#define IV	USE_IV	/* BASE_VOWEL */
 #define N	USE_N	/* BASE_NUM */
 #define O	USE_O	/* OTHER */
 #define R	USE_R	/* REPHA */
 #define Rsv	USE_Rsv	/* Reserved */
 #define S	USE_S	/* SYM */
 #define SUB	USE_SUB	/* CONS_SUB */
 #define VS	USE_VS	/* VARIATION_SELECTOR */
 #define WJ	USE_WJ	/* Word_Joiner */
@@ -75,169 +74,169 @@ static const USE_TABLE_ELEMENT_TYPE use_
   /* 00C0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 00D0 */     O,     O,     O,     O,     O,     O,     O,    GB,
 
 #define use_offset_0x0900u 80
 
 
   /* Devanagari */
 
-  /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 0910 */    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VPst, CMBlw,     B,  VPst,  VPre,
   /* 0940 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VPst,     H,  VPre,  VPst,
   /* 0950 */     O, VMAbv, VMBlw,     O,     O,  VAbv,  VBlw,  VBlw,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0960 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0970 */     O,     O,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0960 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0970 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
 
   /* Bengali */
 
-  /* 0980 */     O, VMAbv, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,    IV,
-  /* 0990 */    IV,     O,     O,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0980 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
+  /* 0990 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 09A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 09B0 */     B,     O,     B,     O,     O,     O,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
   /* 09C0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,   IND,     O,
   /* 09D0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     B,     B,     O,     B,
-  /* 09E0 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 09E0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 09F0 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Gurmukhi */
 
-  /* 0A00 */     O, VMAbv, VMAbv, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,     O,     O,    IV,
-  /* 0A10 */    IV,     O,     O,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0A00 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     B,
+  /* 0A10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0A30 */     B,     O,     B,     B,     O,     B,     B,     O,     B,     B,     O,     O, CMBlw,     O,  VPst,  VPre,
   /* 0A40 */  VPst,  VBlw,  VBlw,     O,     O,     O,     O,  VAbv,  VAbv,     O,     O,  VAbv,  VAbv,     H,     O,     O,
   /* 0A50 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     O,     B,     O,
   /* 0A60 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0A70 */ VMAbv, CMAbv,    GB,    GB,     O,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Gujarati */
 
-  /* 0A80 */     O, VMAbv, VMAbv, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,    IV,
-  /* 0A90 */    IV,    IV,     O,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0A80 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
+  /* 0A90 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0AA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0AB0 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
   /* 0AC0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,     O,  VAbv,  VAbv,  VAbv,     O,  VPst,  VPst,     H,     O,     O,
   /* 0AD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 0AE0 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0AE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0AF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     O,     O,     O,     O,     O,     O,
 
   /* Oriya */
 
-  /* 0B00 */     O, VMAbv, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,    IV,
-  /* 0B10 */    IV,     O,     O,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0B00 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
+  /* 0B10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0B30 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
   /* 0B40 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
   /* 0B50 */     O,     O,     O,     O,     O,     O,  VAbv,  VAbv,     O,     O,     O,     O,     B,     B,     O,     B,
-  /* 0B60 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0B60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0B70 */     O,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Tamil */
 
-  /* 0B80 */     O,     O, VMAbv,   IND,     O,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,     O,    IV,    IV,
-  /* 0B90 */    IV,     O,    IV,    IV,    IV,     B,     O,     O,     O,     B,     B,     O,     B,     O,     B,     B,
+  /* 0B80 */     O,     O, VMAbv,   IND,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,
+  /* 0B90 */     B,     O,     B,     B,     B,     B,     O,     O,     O,     B,     B,     O,     B,     O,     B,     B,
   /* 0BA0 */     O,     O,     O,     B,     B,     O,     O,     O,     B,     B,     B,     O,     O,     O,     B,     B,
   /* 0BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,  VPst,  VPst,
   /* 0BC0 */  VAbv,  VPst,  VPst,     O,     O,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     O,     O,
   /* 0BD0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 0BE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0BF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Telugu */
 
-  /* 0C00 */ VMAbv, VMPst, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,    IV,    IV,
-  /* 0C10 */    IV,     O,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0C00 */ VMAbv, VMPst, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 0C10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0C30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,  VAbv,  VAbv,
   /* 0C40 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
   /* 0C50 */     O,     O,     O,     O,     O,  VAbv,  VBlw,     O,     B,     B,     B,     O,     O,     O,     O,     O,
-  /* 0C60 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0C60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0C70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Kannada */
 
-  /* 0C80 */     O, VMAbv, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,    IV,    IV,
-  /* 0C90 */    IV,     O,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0C80 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 0C90 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0CA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0CB0 */     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
   /* 0CC0 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
   /* 0CD0 */     O,     O,     O,     O,     O,  VPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,     O,
-  /* 0CE0 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0CE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0CF0 */     O,     R,     R,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Malayalam */
 
-  /* 0D00 */     O, VMAbv, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,    IV,    IV,
-  /* 0D10 */    IV,     O,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0D00 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 0D10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,  VPst,  VPst,
   /* 0D40 */  VPst,  VPst,  VPst,  VBlw,  VBlw,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     R,     O,
-  /* 0D50 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,    IV,
-  /* 0D60 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0D50 */     O,     O,     O,     O,   IND,   IND,   IND,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,
+  /* 0D60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,   IND,   IND,   IND,   IND,   IND,   IND,
 
   /* Sinhala */
 
-  /* 0D80 */     O,     O, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 0D90 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,     O,     B,     B,     B,     B,     B,     B,
+  /* 0D80 */     O,     O, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0D90 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,     B,     B,     B,
   /* 0DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0DB0 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     O,
   /* 0DC0 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     H,     O,     O,     O,     O,  VPst,
   /* 0DD0 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,     O,  VBlw,     O,  VPst,  VPre,  VPre,  VPre,  VPre,  VPre,  VPre,  VPst,
   /* 0DE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0DF0 */     O,     O,  VPst,  VPst,     O,     O,     O,     O,
 
 #define use_offset_0x1000u 1352
 
 
   /* Myanmar */
 
   /* 1000 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1020 */     B,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,  VPst,  VPst,  VAbv,  VAbv,  VBlw,
+  /* 1020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VAbv,  VAbv,  VBlw,
   /* 1030 */  VBlw,  VPre,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMBlw, VMPst,     H,  VAbv,  MPst,  MPre,  MBlw,  MBlw,     B,
   /* 1040 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,    GB,     O,
-  /* 1050 */     B,     B,    IV,    IV,    IV,    IV,  VPst,  VPst,  VBlw,  VBlw,     B,     B,     B,     B,  MBlw,  MBlw,
+  /* 1050 */     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VBlw,  VBlw,     B,     B,     B,     B,  MBlw,  MBlw,
   /* 1060 */  MBlw,     B,  VPst, VMPst, VMPst,     B,     B,  VPst,  VPst, VMPst, VMPst, VMPst, VMPst, VMPst,     B,     B,
   /* 1070 */     B,  VAbv,  VAbv,  VAbv,  VAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1080 */     B,     B,  MBlw,  VPst,  VPre,  VAbv,  VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw,     B, VMPst,
   /* 1090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,  VPst,  VAbv,     O,     O,
 
 #define use_offset_0x1700u 1512
 
 
   /* Tagalog */
 
-  /* 1700 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 1700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
   /* 1710 */     B,     B,  VAbv,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Hanunoo */
 
-  /* 1720 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1720 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1730 */     B,     B,  VAbv,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Buhid */
 
-  /* 1740 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1740 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1750 */     B,     B,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Tagbanwa */
 
-  /* 1760 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 1760 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
   /* 1770 */     B,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Khmer */
 
   /* 1780 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1790 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 17A0 */     B,     B,     B,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 17B0 */    IV,    IV,    IV,    IV,     O,     O,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VPre,  VPre,
+  /* 17A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 17B0 */     B,     B,     B,     B,     O,     O,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VPre,  VPre,
   /* 17C0 */  VPre,  VPre,  VPre,  VPre,  VPre,  VPre, VMAbv, VMPst,  VPst, VMAbv, VMAbv,    FM,  FAbv, CMAbv,    FM,    FM,
   /* 17D0 */    FM,  VAbv,     H,    FM,     O,     O,     O,     O,     O,     O,     O,     O,     B,  VAbv,     O,     O,
   /* 17E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
 #define use_offset_0x1900u 1752
 
 
   /* Limbu */
@@ -269,49 +268,49 @@ static const USE_TABLE_ELEMENT_TYPE use_
 
   /* 1A00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1A10 */     B,     B,     B,     B,     B,     B,     B,  VAbv,  VBlw,  VPre,  VPst,  VAbv,     O,     O,     O,     O,
 
   /* Tai Tham */
 
   /* 1A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1A30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,    IV,    IV,    IV,
-  /* 1A50 */    IV,    IV,    IV,     B,     B,  MPre,  MBlw,  FPst,  FAbv,  FAbv,  FAbv,  FBlw,  FBlw,  FBlw,  FBlw,     O,
+  /* 1A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1A50 */     B,     B,     B,     B,     B,  MPre,  MBlw,  FPst,  FAbv,  FAbv,  FAbv,  FBlw,  FBlw,  FBlw,  FBlw,     O,
   /* 1A60 */     H,  VPst,  VAbv,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VAbv,  VBlw,  VPst,  VPre,  VPre,
   /* 1A70 */  VPre,  VPre,  VPre,  VAbv,  VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,    FM,    FM,    FM,     O,     O,    FM,
   /* 1A80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 1A90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
 #define use_offset_0x1b00u 2168
 
 
   /* Balinese */
 
-  /* 1B00 */ VMAbv, VMAbv, VMAbv,  FAbv, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 1B10 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B00 */ VMAbv, VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1B30 */     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VPre,
   /* 1B40 */  VPre,  VPre,  VAbv,  VAbv,     H,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
   /* 1B50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 1B60 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv,
   /* 1B70 */ SMAbv, SMAbv, SMAbv, SMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Sundanese */
 
-  /* 1B80 */ VMAbv,  FAbv, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,
+  /* 1B80 */ VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1B90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1BA0 */     B,   SUB,   SUB,   SUB,  VAbv,  VBlw,  VPre,  VPst,  VAbv,  VAbv,  VPst,     H,   SUB,   SUB,     B,     B,
   /* 1BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
 
   /* Batak */
 
   /* 1BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BE0 */     B,     B,     B,     B,    IV,    IV, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
+  /* 1BE0 */     B,     B,     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
   /* 1BF0 */  FAbv,  FAbv,  VPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Lepcha */
 
   /* 1C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1C20 */     B,     B,     B,     B,   SUB,   SUB,  VPst,  VPre,  VPre,  VPre,  VPst,  VPst,  VBlw,  FAbv,  FAbv,  FAbv,
   /* 1C30 */  FAbv,  FAbv,  FAbv,  FAbv, VMPre, VMPre,    FM, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
@@ -321,56 +320,62 @@ static const USE_TABLE_ELEMENT_TYPE use_
 
 
   /* Vedic Extensions */
 
   /* 1CD0 */ VMAbv, VMAbv, VMAbv,     O, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMAbv, VMAbv, VMBlw, VMBlw, VMBlw, VMBlw,
   /* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw,     O,     O,     O,     O, VMBlw,     O,     O,
   /* 1CF0 */     O,     O, VMPst, VMPst, VMAbv,     O,     O,     O, VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x2008u 2552
+#define use_offset_0x1df8u 2552
+
+
+  /* Combining Diacritical Marks Supplement */
+                                                                         O,     O,     O,    FM,     O,     O,     O,     O,
+
+#define use_offset_0x2008u 2560
 
 
   /* General Punctuation */
                                                                          O,     O,     O,     O,  ZWNJ,   ZWJ,     O,     O,
   /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
 
-#define use_offset_0x2060u 2568
+#define use_offset_0x2060u 2576
 
   /* 2060 */    WJ,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Superscripts and Subscripts */
 
   /* 2070 */     O,     O,     O,     O,    FM,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 2080 */     O,     O,    FM,    FM,    FM,     O,     O,     O,
 
-#define use_offset_0xa800u 2608
+#define use_offset_0xa800u 2616
 
 
   /* Syloti Nagri */
 
-  /* A800 */    IV,    IV,     O,    IV,    IV,    IV,  VAbv,     B,     B,     B,     B, VMAbv,     B,     B,     B,     B,
+  /* A800 */     B,     B,     O,     B,     B,     B,  VAbv,     B,     B,     B,     B, VMAbv,     B,     B,     B,     B,
   /* A810 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A820 */     B,     B,     B,  VPst,  VPst,  VBlw,  VAbv,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A830 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Phags-pa */
 
   /* A840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A850 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A860 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A870 */     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Saurashtra */
 
-  /* A880 */ VMPst, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* A890 */    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A880 */ VMPst, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A8A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A8B0 */     B,     B,     B,     B,  FPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,
-  /* A8C0 */  VPst,  VPst,  VPst,  VPst,     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* A8C0 */  VPst,  VPst,  VPst,  VPst,     H, VMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A8D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* Devanagari Extended */
 
   /* A8E0 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
   /* A8F0 */ VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Kayah Li */
@@ -384,227 +389,259 @@ static const USE_TABLE_ELEMENT_TYPE use_
   /* A930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A940 */     B,     B,     B,     B,     B,     B,     B,  VBlw,  VBlw,  VBlw,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  FAbv,
   /* A950 */  FAbv,  FAbv,  FPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A960 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A970 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Javanese */
 
-  /* A980 */ VMAbv, VMAbv,  FAbv, VMPst,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,    IV,    IV,    IV,     B,
+  /* A980 */ VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A990 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A9A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A9B0 */     B,     B,     B, CMAbv,  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VPre,  VAbv,   SUB,  MPst,  MPst,
   /* A9C0 */     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A9D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* Myanmar Extended-B */
 
   /* A9E0 */     B,     B,     B,     B,     B,  VAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A9F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
 
   /* Cham */
 
-  /* AA00 */    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AA00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AA10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AA20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VAbv,  VPre,
   /* AA30 */  VPre,  VAbv,  VBlw,  MPst,  MPre,  MBlw,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* AA40 */     B,     B,     B,  FAbv,     B,     B,     B,     B,     B,     B,     B,     B,  FAbv,  FPst,     O,     O,
   /* AA50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* Myanmar Extended-A */
 
   /* AA60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AA70 */     O,     B,     B,     B,     O,     O,     O,     O,     O,     O,     B, VMPst, VMAbv, VMPst,     B,     B,
+  /* AA70 */     O,     B,     B,     B,    GB,    GB,    GB,     O,     O,     O,     B, VMPst, VMAbv, VMPst,     B,     B,
 
   /* Tai Viet */
 
   /* AA80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AA90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AAA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AAB0 */  VAbv,     B,  VAbv,  VAbv,  VBlw,     B,     B,  VAbv,  VAbv,     B,     B,     B,     B,     B,  VAbv, VMAbv,
   /* AAC0 */     B, VMAbv,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* AAD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Meetei Mayek Extensions */
 
-  /* AAE0 */    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
+  /* AAE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
   /* AAF0 */     O,     O,     O,     O,     O, VMPst,     H,     O,
 
-#define use_offset_0xabc0u 3368
+#define use_offset_0xabc0u 3376
 
 
   /* Meetei Mayek */
 
-  /* ABC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,    IV,    IV,
-  /* ABD0 */     B,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* ABC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* ABD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* ABE0 */     B,     B,     B,  VPst,  VPst,  VAbv,  VPst,  VPst,  VBlw,  VPst,  VPst,     O, VMPst,  VBlw,     O,     O,
   /* ABF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0xfe00u 3432
+#define use_offset_0xfe00u 3440
 
 
   /* Variation Selectors */
 
   /* FE00 */    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,
 
-#define use_offset_0x10a00u 3448
+#define use_offset_0x10a00u 3456
 
 
   /* Kharoshthi */
 
   /* 10A00 */     B,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,  VBlw,  VBlw, VMBlw, VMAbv,
   /* 10A10 */     B,     B,     B,     B,     O,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
   /* 10A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 10A30 */     B,     B,     B,     B,     O,     O,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
   /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,
 
-#define use_offset_0x11000u 3520
+#define use_offset_0x11000u 3528
 
 
   /* Brahmi */
 
-  /* 11000 */ VMPst, VMAbv, VMPst,     R,     R,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 11010 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11000 */ VMPst, VMAbv, VMPst,     R,     R,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11030 */     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,
   /* 11040 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11050 */     O,     O,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,
   /* 11060 */     N,     N,     N,     N,     N,     N,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11070 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Kaithi */
 
-  /* 11080 */ VMAbv, VMAbv, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,
+  /* 11080 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 110A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 110B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst,     H, CMBlw,     O,     O,     O,     O,     O,
 
-#define use_offset_0x11100u 3712
+#define use_offset_0x11100u 3720
 
 
   /* Chakma */
 
-  /* 11100 */ VMAbv, VMAbv, VMAbv,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11100 */ VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11120 */     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VAbv,  VAbv,
   /* 11130 */  VAbv,  VBlw,  VBlw,     H,  VAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11140 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Mahajani */
 
   /* 11150 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11160 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11170 */     B,     B,     B, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Sharada */
 
-  /* 11180 */ VMAbv, VMAbv, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 11190 */    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11180 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11190 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 111A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 111B0 */     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,
   /* 111C0 */     H,     B,     R,     R,     O,     O,     O,     O,     O,     O, CMBlw,  VAbv,  VBlw,     O,     O,     O,
   /* 111D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* Sinhala Archaic Numbers */
 
   /* 111E0 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 111F0 */     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Khojki */
 
-  /* 11200 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11200 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11210 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VBlw,
-  /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,
+  /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,     O,     O,     O,     O,     O,     O, VMAbv,     O,
 
-#define use_offset_0x11280u 4024
+#define use_offset_0x11280u 4040
 
 
   /* Multani */
 
-  /* 11280 */    IV,    IV,    IV,    IV,     B,     B,     B,     O,     B,     O,     B,     B,     B,     B,     O,     B,
+  /* 11280 */     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     B,     B,     B,     B,     O,     B,
   /* 11290 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
   /* 112A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
 
   /* Khudawadi */
 
-  /* 112B0 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,
+  /* 112B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 112C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 112D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,
   /* 112E0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, CMBlw,  VBlw,     O,     O,     O,     O,     O,
   /* 112F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* Grantha */
 
-  /* 11300 */ VMAbv, VMAbv, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,    IV,
-  /* 11310 */    IV,     O,     O,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11300 */ VMAbv, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
+  /* 11310 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11320 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 11330 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPst,
   /* 11340 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
   /* 11350 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11360 */    IV,    IV,  VPst,  VPst,     O,     O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
+  /* 11360 */     B,     B,  VPst,  VPst,     O,     O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
   /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
 
-#define use_offset_0x11480u 4272
+#define use_offset_0x11400u 4288
+
+
+  /* Newa */
 
+  /* 11400 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11410 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11420 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11430 */     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,
+  /* 11440 */  VPst,  VPst,     H, VMAbv, VMAbv, VMPst, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11450 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 11460 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11470 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Tirhuta */
 
-  /* 11480 */     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,
+  /* 11480 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11490 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 114A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 114B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VPre,  VAbv,  VPre,  VPre,  VPst,  VPre, VMAbv,
   /* 114C0 */ VMAbv, VMPst,     H, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 114D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x11580u 4368
+#define use_offset_0x11580u 4512
 
 
   /* Siddham */
 
-  /* 11580 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,
+  /* 11580 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11590 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 115A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
   /* 115B0 */  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,  VPre,  VPre, VMAbv, VMAbv, VMPst,     H,
   /* 115C0 */ CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 115D0 */     O,     O,     O,     O,     O,     O,     O,     O,    IV,    IV,    IV,    IV,  VBlw,  VBlw,     O,     O,
+  /* 115D0 */     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,  VBlw,  VBlw,     O,     O,
   /* 115E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 115F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Modi */
 
-  /* 11600 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,
+  /* 11600 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11610 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11620 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11630 */  VPst,  VPst,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst, VMAbv, VMPst,     H,
   /* 11640 */  VAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11650 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 11660 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11670 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Takri */
 
-  /* 11680 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,
+  /* 11680 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11690 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 116A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMPst,  VAbv,  VPre,  VPst,
   /* 116B0 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,     H, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 116C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 116D0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 116E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 116F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Ahom */
 
   /* 11700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11710 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,  MBlw,  MPre,  MAbv,
   /* 11720 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,
   /* 11730 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
 
-}; /* Table items: 4816; occupancy: 72% */
+#define use_offset_0x11c00u 4960
+
+
+  /* Bhaiksuki */
+
+  /* 11C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 11C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
+  /* 11C30 */  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMAbv, VMPst,     H,
+  /* 11C40 */     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11C50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+
+  /* Marchen */
+
+  /* 11C70 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C90 */     O,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 11CA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 11CB0 */  VBlw,  VPre,  VBlw,  VAbv,  VPst, VMAbv, VMAbv,     O,
+
+}; /* Table items: 5144; occupancy: 72% */
 
 USE_TABLE_ELEMENT_TYPE
 hb_use_get_categories (hb_codepoint_t u)
 {
   switch (u >> 12)
   {
     case 0x0u:
       if (hb_in_range (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
@@ -614,16 +651,17 @@ hb_use_get_categories (hb_codepoint_t u)
       break;
 
     case 0x1u:
       if (hb_in_range (u, 0x1000u, 0x109Fu)) return use_table[u - 0x1000u + use_offset_0x1000u];
       if (hb_in_range (u, 0x1700u, 0x17EFu)) return use_table[u - 0x1700u + use_offset_0x1700u];
       if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
       if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
       if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
+      if (hb_in_range (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u];
       break;
 
     case 0x2u:
       if (hb_in_range (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
       if (hb_in_range (u, 0x2060u, 0x2087u)) return use_table[u - 0x2060u + use_offset_0x2060u];
       if (unlikely (u == 0x25CCu)) return GB;
       break;
 
@@ -637,37 +675,37 @@ hb_use_get_categories (hb_codepoint_t u)
       break;
 
     case 0x10u:
       if (hb_in_range (u, 0x10A00u, 0x10A47u)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
       break;
 
     case 0x11u:
       if (hb_in_range (u, 0x11000u, 0x110BFu)) return use_table[u - 0x11000u + use_offset_0x11000u];
-      if (hb_in_range (u, 0x11100u, 0x11237u)) return use_table[u - 0x11100u + use_offset_0x11100u];
+      if (hb_in_range (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
       if (hb_in_range (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
-      if (hb_in_range (u, 0x11480u, 0x114DFu)) return use_table[u - 0x11480u + use_offset_0x11480u];
+      if (hb_in_range (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
       if (hb_in_range (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u];
+      if (hb_in_range (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u];
       if (unlikely (u == 0x1107Fu)) return HN;
       break;
 
     default:
       break;
   }
   return USE_O;
 }
 
 #undef B
 #undef CGJ
 #undef FM
 #undef GB
 #undef H
 #undef HN
 #undef IND
-#undef IV
 #undef N
 #undef O
 #undef R
 #undef Rsv
 #undef S
 #undef SUB
 #undef VS
 #undef WJ
--- a/gfx/harfbuzz/src/hb-ot-shape-complex-use.cc
+++ b/gfx/harfbuzz/src/hb-ot-shape-complex-use.cc
@@ -179,16 +179,19 @@ has_arabic_joining (hb_script_t script)
 
     /* Unicode-6.0 additions */
     case HB_SCRIPT_MANDAIC:
 
     /* Unicode-7.0 additions */
     case HB_SCRIPT_MANICHAEAN:
     case HB_SCRIPT_PSALTER_PAHLAVI:
 
+    /* Unicode-9.0 additions */
+    case HB_SCRIPT_ADLAM:
+
       return true;
 
     default:
       return false;
   }
 }
 
 static void *
@@ -222,22 +225,22 @@ data_destroy_use (void *data)
     data_destroy_arabic (use_plan->arabic_plan);
 
   free (data);
 }
 
 enum syllable_type_t {
   independent_cluster,
   virama_terminated_cluster,
-  consonant_cluster,
-  vowel_cluster,
+  standard_cluster,
   number_joiner_terminated_cluster,
   numeral_cluster,
   symbol_cluster,
   broken_cluster,
+  non_cluster,
 };
 
 #include "hb-ot-shape-complex-use-machine.hh"
 
 
 static void
 setup_masks_use (const hb_ot_shape_plan_t *plan,
 		 hb_buffer_t              *buffer,
@@ -307,23 +310,23 @@ setup_topographical_masks (const hb_ot_s
   hb_glyph_info_t *info = buffer->info;
   foreach_syllable (buffer, start, end)
   {
     syllable_type_t syllable_type = (syllable_type_t) (info[start].syllable() & 0x0F);
     switch (syllable_type)
     {
       case independent_cluster:
       case symbol_cluster:
+      case non_cluster:
 	/* These don't join.  Nothing to do. */
 	last_form = _NONE;
 	break;
 
       case virama_terminated_cluster:
-      case consonant_cluster:
-      case vowel_cluster:
+      case standard_cluster:
       case number_joiner_terminated_cluster:
       case numeral_cluster:
       case broken_cluster:
 
 	bool join = last_form == FINA || last_form == ISOL;
 
 	if (join)
 	{
@@ -416,25 +419,24 @@ is_halant (const hb_glyph_info_t &info)
 
 static void
 reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
 {
   syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
   /* Only a few syllable types need reordering. */
   if (unlikely (!(FLAG_SAFE (syllable_type) &
 		  (FLAG (virama_terminated_cluster) |
-		   FLAG (consonant_cluster) |
-		   FLAG (vowel_cluster) |
+		   FLAG (standard_cluster) |
 		   FLAG (broken_cluster) |
 		   0))))
     return;
 
   hb_glyph_info_t *info = buffer->info;
 
-#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB) | FLAG (USE_IV))
+#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB))
 
   /* Move things forward. */
   if (info[start].use_category() == USE_R && end - start > 1)
   {
     /* Got a repha.  Reorder it to after first base, before first halant. */
     for (unsigned int i = start + 1; i < end; i++)
       if ((FLAG_UNSAFE (info[i].use_category()) & (BASE_FLAGS)) || is_halant (info[i]))
       {
--- a/gfx/harfbuzz/src/hb-ot-tag.cc
+++ b/gfx/harfbuzz/src/hb-ot-tag.cc
@@ -181,57 +181,65 @@ typedef struct {
  * items in OpenType 1.7 (red items), most of which we have:
  * http://www.microsoft.com/typography/otspec170/languagetags.htm
  */
 
 static const LangTag ot_languages[] = {
   {"aa",	HB_TAG('A','F','R',' ')},	/* Afar */
   {"ab",	HB_TAG('A','B','K',' ')},	/* Abkhazian */
   {"abq",	HB_TAG('A','B','A',' ')},	/* Abaza */
+  {"acf",	HB_TAG('F','A','N',' ')},	/* French Antillean */
   {"ach",	HB_TAG('A','C','H',' ')},	/* Acoli */
+  {"acr",	HB_TAG('A','C','R',' ')},	/* Achi */
   {"ada",	HB_TAG('D','N','G',' ')},	/* Dangme */
   {"ady",	HB_TAG('A','D','Y',' ')},	/* Adyghe */
   {"af",	HB_TAG('A','F','K',' ')},	/* Afrikaans */
+  {"ahg",	HB_TAG('A','G','W',' ')},	/* Agaw */
   {"aii",	HB_TAG('S','W','A',' ')},	/* Swadaya Aramaic */
   {"aio",	HB_TAG('A','I','O',' ')},	/* Aiton */
   {"aiw",	HB_TAG('A','R','I',' ')},	/* Aari */
   {"ak",	HB_TAG('T','W','I',' ')},	/* Akan [macrolanguage] */
+  {"aka",	HB_TAG('A','K','A',' ')},	/* Akan */
   {"alt",	HB_TAG('A','L','T',' ')},	/* [Southern] Altai */
   {"am",	HB_TAG('A','M','H',' ')},	/* Amharic */
   {"amf",	HB_TAG('H','B','N',' ')},	/* Hammer-Banna */
   {"an",	HB_TAG('A','R','G',' ')},	/* Aragonese */
   {"ang",	HB_TAG('A','N','G',' ')},	/* Old English (ca. 450-1100) */
   {"ar",	HB_TAG('A','R','A',' ')},	/* Arabic [macrolanguage] */
   {"arb",	HB_TAG('A','R','A',' ')},	/* Standard Arabic */
   {"arn",	HB_TAG('M','A','P',' ')},	/* Mapudungun */
   {"ary",	HB_TAG('M','O','R',' ')},	/* Moroccan Arabic */
   {"as",	HB_TAG('A','S','M',' ')},	/* Assamese */
   {"ast",	HB_TAG('A','S','T',' ')},	/* Asturian/Asturleonese/Bable/Leonese */
   {"ath",	HB_TAG('A','T','H',' ')},	/* Athapaskan [family] */
+  {"atj",	HB_TAG('R','C','R',' ')},	/* R-Cree */
   {"atv",	HB_TAG('A','L','T',' ')},	/* [Northern] Altai */
   {"av",	HB_TAG('A','V','R',' ')},	/* Avaric */
   {"awa",	HB_TAG('A','W','A',' ')},	/* Awadhi */
   {"ay",	HB_TAG('A','Y','M',' ')},	/* Aymara [macrolanguage] */
   {"az",	HB_TAG('A','Z','E',' ')},	/* Azerbaijani [macrolanguage] */
   {"azb",	HB_TAG('A','Z','B',' ')},	/* South Azerbaijani */
   {"azj",	HB_TAG('A','Z','E',' ')},	/* North Azerbaijani */
   {"ba",	HB_TAG('B','S','H',' ')},	/* Bashkir */
+  {"bad",	HB_TAG('B','A','D','0')},	/* Banda */
   {"bai",	HB_TAG('B','M','L',' ')},	/* Bamileke [family] */
   {"bal",	HB_TAG('B','L','I',' ')},	/* Baluchi [macrolangauge] */
   {"ban",	HB_TAG('B','A','N',' ')},	/* Balinese */
   {"bar",	HB_TAG('B','A','R',' ')},	/* Bavarian */
   {"bbc",	HB_TAG('B','B','C',' ')},	/* Batak Toba */
   {"bci",	HB_TAG('B','A','U',' ')},	/* Baoulé */
   {"bcl",	HB_TAG('B','I','K',' ')},	/* Central Bikol */
   {"bcq",	HB_TAG('B','C','H',' ')},	/* Bench */
+  {"bdy",	HB_TAG('B','D','Y',' ')},	/* Bandjalang */
   {"be",	HB_TAG('B','E','L',' ')},	/* Belarusian */
   {"bem",	HB_TAG('B','E','M',' ')},	/* Bemba (Zambia) */
   {"ber",	HB_TAG('B','E','R',' ')},	/* Berber [family] */
   {"bfq",	HB_TAG('B','A','D',' ')},	/* Badaga */
   {"bft",	HB_TAG('B','L','T',' ')},	/* Balti */
+  {"bfu",	HB_TAG('L','A','H',' ')},	/* Lahuli */
   {"bfy",	HB_TAG('B','A','G',' ')},	/* Baghelkhandi */
   {"bg",	HB_TAG('B','G','R',' ')},	/* Bulgarian */
   {"bgc",	HB_TAG('B','G','C',' ')},	/* Haryanvi */
   {"bgq",	HB_TAG('B','G','Q',' ')},	/* Bagri */
   {"bhb",	HB_TAG('B','H','I',' ')},	/* Bhili */
   {"bhk",	HB_TAG('B','I','K',' ')},	/* Albay Bicolano (retired code) */
   {"bho",	HB_TAG('B','H','O',' ')},	/* Bhojpuri */
   {"bi",	HB_TAG('B','I','S',' ')},	/* Bislama */
@@ -255,189 +263,228 @@ static const LangTag ot_languages[] = {
   {"bs",	HB_TAG('B','O','S',' ')},	/* Bosnian */
   {"btb",	HB_TAG('B','T','I',' ')},	/* Beti (Cameroon) */
   {"bto",	HB_TAG('B','I','K',' ')},	/* Rinconada Bikol */
   {"bts",	HB_TAG('B','T','S',' ')},	/* Batak Simalungun */
   {"bug",	HB_TAG('B','U','G',' ')},	/* Buginese */
   {"bxr",	HB_TAG('R','B','U',' ')},	/* Russian Buriat */
   {"byn",	HB_TAG('B','I','L',' ')},	/* Bilen */
   {"ca",	HB_TAG('C','A','T',' ')},	/* Catalan */
+  {"cak",	HB_TAG('C','A','K',' ')},	/* Kaqchikel */
   {"cbk",	HB_TAG('C','B','K',' ')},	/* Chavacano */
   {"ce",	HB_TAG('C','H','E',' ')},	/* Chechen */
   {"ceb",	HB_TAG('C','E','B',' ')},	/* Cebuano */
   {"cgg",	HB_TAG('C','G','G',' ')},	/* Chiga */
   {"ch",	HB_TAG('C','H','A',' ')},	/* Chamorro */
+  {"chk",	HB_TAG('C','H','K','0')},	/* Chuukese */
   {"cho",	HB_TAG('C','H','O',' ')},	/* Choctaw */
   {"chp",	HB_TAG('C','H','P',' ')},	/* Chipewyan */
   {"chr",	HB_TAG('C','H','R',' ')},	/* Cherokee */
   {"chy",	HB_TAG('C','H','Y',' ')},	/* Cheyenne */
   {"ckb",	HB_TAG('K','U','R',' ')},	/* Central Kurdish (Sorani) */
   {"ckt",	HB_TAG('C','H','K',' ')},	/* Chukchi */
   {"cop",	HB_TAG('C','O','P',' ')},	/* Coptic */
+  {"cpp",	HB_TAG('C','P','P',' ')},	/* Creoles */
   {"cr",	HB_TAG('C','R','E',' ')},	/* Cree */
+  {"cre",	HB_TAG('Y','C','R',' ')},	/* Y-Cree */
   {"crh",	HB_TAG('C','R','T',' ')},	/* Crimean Tatar */
   {"crj",	HB_TAG('E','C','R',' ')},	/* [Southern] East Cree */
+  {"crk",	HB_TAG('W','C','R',' ')},	/* West-Cree */
   {"crl",	HB_TAG('E','C','R',' ')},	/* [Northern] East Cree */
   {"crm",	HB_TAG('M','C','R',' ')},	/* Moose Cree */
   {"crx",	HB_TAG('C','R','R',' ')},	/* Carrier */
   {"cs",	HB_TAG('C','S','Y',' ')},	/* Czech */
   {"csb",	HB_TAG('C','S','B',' ')},	/* Kashubian */
   {"ctg",	HB_TAG('C','T','G',' ')},	/* Chittagonian */
   {"cts",	HB_TAG('B','I','K',' ')},	/* Northern Catanduanes Bikol */
   {"cu",	HB_TAG('C','S','L',' ')},	/* Church Slavic */
+  {"cuk",	HB_TAG('C','U','K',' ')},	/* San Blas Kuna */
   {"cv",	HB_TAG('C','H','U',' ')},	/* Chuvash */
   {"cwd",	HB_TAG('D','C','R',' ')},	/* Woods Cree */
   {"cy",	HB_TAG('W','E','L',' ')},	/* Welsh */
   {"da",	HB_TAG('D','A','N',' ')},	/* Danish */
   {"dap",	HB_TAG('N','I','S',' ')},	/* Nisi (India) */
   {"dar",	HB_TAG('D','A','R',' ')},	/* Dargwa */
+  {"dax",	HB_TAG('D','A','X',' ')},	/* Dayi */
   {"de",	HB_TAG('D','E','U',' ')},	/* German */
   {"dgo",	HB_TAG('D','G','O',' ')},	/* Dogri */
   {"dhd",	HB_TAG('M','A','W',' ')},	/* Dhundari */
+  {"dhg",	HB_TAG('D','H','G',' ')},	/* Dhangu */
   {"din",	HB_TAG('D','N','K',' ')},	/* Dinka [macrolanguage] */
   {"diq",	HB_TAG('D','I','Q',' ')},	/* Dimli */
   {"dje",	HB_TAG('D','J','R',' ')},	/* Zarma */
+  {"djr",	HB_TAG('D','J','R','0')},	/* Djambarrpuyngu */
   {"dng",	HB_TAG('D','U','N',' ')},	/* Dungan */
+  {"dnj",	HB_TAG('D','N','J',' ')},	/* Dan */
   {"doi",	HB_TAG('D','G','R',' ')},	/* Dogri [macrolanguage] */
   {"dsb",	HB_TAG('L','S','B',' ')},	/* Lower Sorbian */
+  {"duj",	HB_TAG('D','U','J',' ')},	/* Dhuwal */
   {"dv",	HB_TAG('D','I','V',' ')},	/* Dhivehi/Divehi/Maldivian */
   {"dyu",	HB_TAG('J','U','L',' ')},	/* Jula */
   {"dz",	HB_TAG('D','Z','N',' ')},	/* Dzongkha */
   {"ee",	HB_TAG('E','W','E',' ')},	/* Ewe */
   {"efi",	HB_TAG('E','F','I',' ')},	/* Efik */
   {"ekk",	HB_TAG('E','T','I',' ')},	/* Standard Estonian */
   {"el",	HB_TAG('E','L','L',' ')},	/* Modern Greek (1453-) */
   {"emk",	HB_TAG('M','N','K',' ')},	/* Eastern Maninkakan */
   {"en",	HB_TAG('E','N','G',' ')},	/* English */
+  {"enf",	HB_TAG('F','N','E',' ')},	/* Forest Nenets */
+  {"enh",	HB_TAG('T','N','E',' ')},	/* Tundra Nenets */
   {"eo",	HB_TAG('N','T','O',' ')},	/* Esperanto */
   {"eot",	HB_TAG('B','T','I',' ')},	/* Beti (Côte d'Ivoire) */
   {"es",	HB_TAG('E','S','P',' ')},	/* Spanish */
+  {"esu",	HB_TAG('E','S','U',' ')},	/* Central Yupik */
   {"et",	HB_TAG('E','T','I',' ')},	/* Estonian [macrolanguage] */
   {"eu",	HB_TAG('E','U','Q',' ')},	/* Basque */
   {"eve",	HB_TAG('E','V','N',' ')},	/* Even */
   {"evn",	HB_TAG('E','V','K',' ')},	/* Evenki */
   {"fa",	HB_TAG('F','A','R',' ')},	/* Persian [macrolanguage] */
+  {"fan",	HB_TAG('F','A','N','0')},	/* Fang */
+  {"fat",	HB_TAG('F','A','T',' ')},	/* Fanti */
   {"ff",	HB_TAG('F','U','L',' ')},	/* Fulah [macrolanguage] */
   {"fi",	HB_TAG('F','I','N',' ')},	/* Finnish */
   {"fil",	HB_TAG('P','I','L',' ')},	/* Filipino */
   {"fj",	HB_TAG('F','J','I',' ')},	/* Fijian */
+  {"flm",	HB_TAG('H','A','L',' ')},	/* Halam */
   {"fo",	HB_TAG('F','O','S',' ')},	/* Faroese */
   {"fon",	HB_TAG('F','O','N',' ')},	/* Fon */
   {"fr",	HB_TAG('F','R','A',' ')},	/* French */
   {"frc",	HB_TAG('F','R','C',' ')},	/* Cajun French */
   {"frp",	HB_TAG('F','R','P',' ')},	/* Arpitan/Francoprovençal */
+  {"fuf",	HB_TAG('F','T','A',' ')},	/* Futa */
   {"fur",	HB_TAG('F','R','L',' ')},	/* Friulian */
   {"fuv",	HB_TAG('F','U','V',' ')},	/* Nigerian Fulfulde */
   {"fy",	HB_TAG('F','R','I',' ')},	/* Western Frisian */
   {"ga",	HB_TAG('I','R','I',' ')},	/* Irish */
   {"gaa",	HB_TAG('G','A','D',' ')},	/* Ga */
   {"gag",	HB_TAG('G','A','G',' ')},	/* Gagauz */
   {"gbm",	HB_TAG('G','A','W',' ')},	/* Garhwali */
   {"gd",	HB_TAG('G','A','E',' ')},	/* Scottish Gaelic */
   {"gez",	HB_TAG('G','E','Z',' ')},	/* Ge'ez */
   {"ggo",	HB_TAG('G','O','N',' ')},	/* Southern Gondi */
+  {"gih",	HB_TAG('G','I','H',' ')},	/* Githabul */
+  {"gil",	HB_TAG('G','I','L','0')},	/* Kiribati (Gilbertese) */
+  {"gkp",	HB_TAG('G','K','P',' ')},	/* Kpelle (Guinea) */
   {"gl",	HB_TAG('G','A','L',' ')},	/* Galician */
   {"gld",	HB_TAG('N','A','N',' ')},	/* Nanai */
+  {"gle",	HB_TAG('I','R','T',' ')},	/* Irish Traditional */
   {"glk",	HB_TAG('G','L','K',' ')},	/* Gilaki */
   {"gn",	HB_TAG('G','U','A',' ')},	/* Guarani [macrolanguage] */
+  {"gnn",	HB_TAG('G','N','N',' ')},	/* Gumatj */
   {"gno",	HB_TAG('G','O','N',' ')},	/* Northern Gondi */
   {"gog",	HB_TAG('G','O','G',' ')},	/* Gogo */
   {"gon",	HB_TAG('G','O','N',' ')},	/* Gondi [macrolanguage] */
   {"grt",	HB_TAG('G','R','O',' ')},	/* Garo */
   {"gru",	HB_TAG('S','O','G',' ')},	/* Sodo Gurage */
+  {"gsw",	HB_TAG('A','L','S',' ')},	/* Alsatian */
   {"gu",	HB_TAG('G','U','J',' ')},	/* Gujarati */
   {"guc",	HB_TAG('G','U','C',' ')},	/* Wayuu */
+  {"guf",	HB_TAG('G','U','F',' ')},	/* Gupapuyngu */
   {"guk",	HB_TAG('G','M','Z',' ')},	/* Gumuz */
 /*{"guk",	HB_TAG('G','U','K',' ')},*/	/* Gumuz (in SIL fonts) */
   {"guz",	HB_TAG('G','U','Z',' ')},	/* Ekegusii/Gusii */
   {"gv",	HB_TAG('M','N','X',' ')},	/* Manx */
   {"ha",	HB_TAG('H','A','U',' ')},	/* Hausa */
   {"har",	HB_TAG('H','R','I',' ')},	/* Harari */
   {"haw",	HB_TAG('H','A','W',' ')},	/* Hawaiian */
   {"hay",	HB_TAG('H','A','Y',' ')},	/* Haya */
   {"haz",	HB_TAG('H','A','Z',' ')},	/* Hazaragi */
   {"he",	HB_TAG('I','W','R',' ')},	/* Hebrew */
   {"hi",	HB_TAG('H','I','N',' ')},	/* Hindi */
   {"hil",	HB_TAG('H','I','L',' ')},	/* Hiligaynon */
+  {"hmn",	HB_TAG('H','M','N',' ')},	/* Hmong */
   {"hnd",	HB_TAG('H','N','D',' ')},	/* [Southern] Hindko */
   {"hne",	HB_TAG('C','H','H',' ')},	/* Chattisgarhi */
   {"hno",	HB_TAG('H','N','D',' ')},	/* [Northern] Hindko */
   {"ho",	HB_TAG('H','M','O',' ')},	/* Hiri Motu */
   {"hoc",	HB_TAG('H','O',' ',' ')},	/* Ho */
   {"hoj",	HB_TAG('H','A','R',' ')},	/* Harauti */
   {"hr",	HB_TAG('H','R','V',' ')},	/* Croatian */
   {"hsb",	HB_TAG('U','S','B',' ')},	/* Upper Sorbian */
   {"ht",	HB_TAG('H','A','I',' ')},	/* Haitian/Haitian Creole */
   {"hu",	HB_TAG('H','U','N',' ')},	/* Hungarian */
   {"hy",	HB_TAG('H','Y','E',' ')},	/* Armenian */
   {"hz",	HB_TAG('H','E','R',' ')},	/* Herero */
   {"ia",	HB_TAG('I','N','A',' ')},	/* Interlingua (International Auxiliary Language Association) */
+  {"iba",	HB_TAG('I','B','A',' ')},	/* Iban */
   {"ibb",	HB_TAG('I','B','B',' ')},	/* Ibibio */
   {"id",	HB_TAG('I','N','D',' ')},	/* Indonesian */
   {"ie",	HB_TAG('I','L','E',' ')},	/* Interlingue/Occidental */
   {"ig",	HB_TAG('I','B','O',' ')},	/* Igbo */
   {"igb",	HB_TAG('E','B','I',' ')},	/* Ebira */
+  {"ii",	HB_TAG('Y','I','M',' ')},	/* Yi Modern */
   {"ijc",	HB_TAG('I','J','O',' ')},	/* Izon */
   {"ijo",	HB_TAG('I','J','O',' ')},	/* Ijo [family] */
   {"ik",	HB_TAG('I','P','K',' ')},	/* Inupiaq [macrolanguage] */
   {"ilo",	HB_TAG('I','L','O',' ')},	/* Ilokano */
   {"inh",	HB_TAG('I','N','G',' ')},	/* Ingush */
   {"io",	HB_TAG('I','D','O',' ')},	/* Ido */
   {"is",	HB_TAG('I','S','L',' ')},	/* Icelandic */
   {"it",	HB_TAG('I','T','A',' ')},	/* Italian */
   {"iu",	HB_TAG('I','N','U',' ')},	/* Inuktitut [macrolanguage] */
   {"ja",	HB_TAG('J','A','N',' ')},	/* Japanese */
   {"jam",	HB_TAG('J','A','M',' ')},	/* Jamaican Creole English */
   {"jbo",	HB_TAG('J','B','O',' ')},	/* Lojban */
   {"jv",	HB_TAG('J','A','V',' ')},	/* Javanese */
   {"ka",	HB_TAG('K','A','T',' ')},	/* Georgian */
   {"kaa",	HB_TAG('K','R','K',' ')},	/* Karakalpak */
-  {"kab",	HB_TAG('K','A','B',' ')},	/* Kabyle */
+  {"kab",	HB_TAG('K','A','B','0')},	/* Kabyle */
   {"kam",	HB_TAG('K','M','B',' ')},	/* Kamba (Kenya) */
   {"kar",	HB_TAG('K','R','N',' ')},	/* Karen [family] */
+  {"kat",	HB_TAG('K','G','E',' ')},	/* Khutsuri Georgian */
   {"kbd",	HB_TAG('K','A','B',' ')},	/* Kabardian */
   {"kde",	HB_TAG('K','D','E',' ')},	/* Makonde */
   {"kdr",	HB_TAG('K','R','M',' ')},	/* Karaim */
   {"kdt",	HB_TAG('K','U','Y',' ')},	/* Kuy */
+  {"kea",	HB_TAG('K','E','A',' ')},	/* Kabuverdianu (Crioulo) */
+  {"kek",	HB_TAG('K','E','K',' ')},	/* Kekchi */
   {"kex",	HB_TAG('K','K','N',' ')},	/* Kokni */
+  {"kfa",	HB_TAG('K','O','D',' ')},	/* Kodagu */
   {"kfr",	HB_TAG('K','A','C',' ')},	/* Kachchi */
+  {"kfx",	HB_TAG('K','U','L',' ')},	/* Kulvi */
   {"kfy",	HB_TAG('K','M','N',' ')},	/* Kumaoni */
   {"kg",	HB_TAG('K','O','N',' ')},	/* Kongo [macrolanguage] */
   {"kha",	HB_TAG('K','S','I',' ')},	/* Khasi */
   {"khb",	HB_TAG('X','B','D',' ')},	/* Lü */
   {"kht",	HB_TAG('K','H','N',' ')},	/* Khamti (Microsoft fonts) */
 /*{"kht",	HB_TAG('K','H','T',' ')},*/	/* Khamti (OpenType spec and SIL fonts) */
   {"khw",	HB_TAG('K','H','W',' ')},	/* Khowar */
   {"ki",	HB_TAG('K','I','K',' ')},	/* Gikuyu/Kikuyu */
+  {"kiu",	HB_TAG('K','I','U',' ')},	/* Kirmanjki */
   {"kj",	HB_TAG('K','U','A',' ')},	/* Kuanyama/Kwanyama */
+  {"kjd",	HB_TAG('K','J','D',' ')},	/* Southern Kiwai */
   {"kjh",	HB_TAG('K','H','A',' ')},	/* Khakass */
   {"kjp",	HB_TAG('K','J','P',' ')},	/* Pwo Eastern Karen */
   {"kk",	HB_TAG('K','A','Z',' ')},	/* Kazakh */
   {"kl",	HB_TAG('G','R','N',' ')},	/* Kalaallisut */
   {"kln",	HB_TAG('K','A','L',' ')},	/* Kalenjin */
   {"km",	HB_TAG('K','H','M',' ')},	/* Central Khmer */
   {"kmb",	HB_TAG('M','B','N',' ')},	/* Kimbundu */
   {"kmw",	HB_TAG('K','M','O',' ')},	/* Komo (Democratic Republic of Congo) */
   {"kn",	HB_TAG('K','A','N',' ')},	/* Kannada */
   {"knn",	HB_TAG('K','O','K',' ')},	/* Konkani */
   {"ko",	HB_TAG('K','O','R',' ')},	/* Korean */
   {"koi",	HB_TAG('K','O','P',' ')},	/* Komi-Permyak */
   {"kok",	HB_TAG('K','O','K',' ')},	/* Konkani [macrolanguage] */
+  {"kon",	HB_TAG('K','O','N','0')},	/* Kongo */
+  {"kos",	HB_TAG('K','O','S',' ')},	/* Kosraean */
   {"kpe",	HB_TAG('K','P','L',' ')},	/* Kpelle [macrolanguage] */
   {"kpv",	HB_TAG('K','O','Z',' ')},	/* Komi-Zyrian */
   {"kpy",	HB_TAG('K','Y','K',' ')},	/* Koryak */
   {"kqy",	HB_TAG('K','R','T',' ')},	/* Koorete */
   {"kr",	HB_TAG('K','N','R',' ')},	/* Kanuri [macrolanguage] */
   {"kri",	HB_TAG('K','R','I',' ')},	/* Krio */
   {"krl",	HB_TAG('K','R','L',' ')},	/* Karelian */
   {"kru",	HB_TAG('K','U','U',' ')},	/* Kurukh */
   {"ks",	HB_TAG('K','S','H',' ')},	/* Kashmiri */
-  {"ksh",	HB_TAG('K','S','H',' ')},	/* Kölsch */
+  {"ksh",	HB_TAG('K','S','H','0')},	/* Ripuarian, Kölsch */
 /*{"ksw",	HB_TAG('K','R','N',' ')},*/	/* S'gaw Karen (Microsoft fonts?) */
   {"ksw",	HB_TAG('K','S','W',' ')},	/* S'gaw Karen (OpenType spec and SIL fonts) */
+  {"ktb",	HB_TAG('K','E','B',' ')},	/* Kebena */
+  {"ktu",	HB_TAG('K','O','N',' ')},	/* Kikongo */
   {"ku",	HB_TAG('K','U','R',' ')},	/* Kurdish [macrolanguage] */
   {"kum",	HB_TAG('K','U','M',' ')},	/* Kumyk */
   {"kv",	HB_TAG('K','O','M',' ')},	/* Komi [macrolanguage] */
   {"kvd",	HB_TAG('K','U','I',' ')},	/* Kui (Indonesia) */
   {"kw",	HB_TAG('C','O','R',' ')},	/* Cornish */
   {"kxc",	HB_TAG('K','M','S',' ')},	/* Komso */
   {"kxu",	HB_TAG('K','U','I',' ')},	/* Kui (India) */
   {"ky",	HB_TAG('K','I','R',' ')},	/* Kirghiz/Kyrgyz */
@@ -455,30 +502,33 @@ static const LangTag ot_languages[] = {
   {"lis",	HB_TAG('L','I','S',' ')},	/* Lisu */
   {"ljp",	HB_TAG('L','J','P',' ')},	/* Lampung Api */
   {"lki",	HB_TAG('L','K','I',' ')},	/* Laki */
   {"lld",	HB_TAG('L','A','D',' ')},	/* Ladin */
   {"lmn",	HB_TAG('L','A','M',' ')},	/* Lambani */
   {"lmo",	HB_TAG('L','M','O',' ')},	/* Lombard */
   {"ln",	HB_TAG('L','I','N',' ')},	/* Lingala */
   {"lo",	HB_TAG('L','A','O',' ')},	/* Lao */
+  {"lom",	HB_TAG('L','O','M',' ')},	/* Loma */
   {"lrc",	HB_TAG('L','R','C',' ')},	/* Northern Luri */
   {"lt",	HB_TAG('L','T','H',' ')},	/* Lithuanian */
   {"lu",	HB_TAG('L','U','B',' ')},	/* Luba-Katanga */
   {"lua",	HB_TAG('L','U','B',' ')},	/* Luba-Kasai */
   {"luo",	HB_TAG('L','U','O',' ')},	/* Luo (Kenya and Tanzania) */
   {"lus",	HB_TAG('M','I','Z',' ')},	/* Mizo */
   {"luy",	HB_TAG('L','U','H',' ')},	/* Luyia/Oluluyia [macrolanguage] */
   {"luz",	HB_TAG('L','R','C',' ')},	/* Southern Luri */
   {"lv",	HB_TAG('L','V','I',' ')},	/* Latvian */
   {"lzz",	HB_TAG('L','A','Z',' ')},	/* Laz */
   {"mad",	HB_TAG('M','A','D',' ')},	/* Madurese */
   {"mag",	HB_TAG('M','A','G',' ')},	/* Magahi */
   {"mai",	HB_TAG('M','T','H',' ')},	/* Maithili */
   {"mak",	HB_TAG('M','K','R',' ')},	/* Makasar */
+  {"mal",	HB_TAG('M','A','L',' ')},	/* Malayalam */
+  {"mam",	HB_TAG('M','A','M',' ')},	/* Mam */
   {"man",	HB_TAG('M','N','K',' ')},	/* Manding/Mandingo [macrolanguage] */
   {"mdc",	HB_TAG('M','L','E',' ')},	/* Male (Papua New Guinea) */
   {"mdf",	HB_TAG('M','O','K',' ')},	/* Moksha */
   {"mdr",	HB_TAG('M','D','R',' ')},	/* Mandar */
   {"mdy",	HB_TAG('M','L','E',' ')},	/* Male (Ethiopia) */
   {"men",	HB_TAG('M','D','E',' ')},	/* Mende (Sierra Leone) */
   {"mer",	HB_TAG('M','E','R',' ')},	/* Meru */
   {"mfe",	HB_TAG('M','F','E',' ')},	/* Morisyen */
@@ -511,16 +561,17 @@ static const LangTag ot_languages[] = {
   {"mus",	HB_TAG('M','U','S',' ')},	/* Creek */
   {"mve",	HB_TAG('M','A','W',' ')},	/* Marwari (Pakistan) */
   {"mwk",	HB_TAG('M','N','K',' ')},	/* Kita Maninkakan */
   {"mwl",	HB_TAG('M','W','L',' ')},	/* Mirandese */
   {"mwr",	HB_TAG('M','A','W',' ')},	/* Marwari [macrolanguage] */
   {"mww",	HB_TAG('M','W','W',' ')},	/* Hmong Daw */
   {"my",	HB_TAG('B','R','M',' ')},	/* Burmese */
   {"mym",	HB_TAG('M','E','N',' ')},	/* Me'en */
+  {"myn",	HB_TAG('M','Y','N',' ')},	/* Mayan */
   {"myq",	HB_TAG('M','N','K',' ')},	/* Forest Maninka (retired code) */
   {"myv",	HB_TAG('E','R','Z',' ')},	/* Erzya */
   {"mzn",	HB_TAG('M','Z','N',' ')},	/* Mazanderani */
   {"na",	HB_TAG('N','A','U',' ')},	/* Nauru */
   {"nag",	HB_TAG('N','A','G',' ')},	/* Naga-Assamese */
   {"nah",	HB_TAG('N','A','H',' ')},	/* Nahuatl [family] */
   {"nap",	HB_TAG('N','A','P',' ')},	/* Neapolitan */
   {"nb",	HB_TAG('N','O','R',' ')},	/* Norwegian Bokmål */
@@ -528,16 +579,17 @@ static const LangTag ot_languages[] = {
   {"nd",	HB_TAG('N','D','B',' ')},	/* [North] Ndebele */
   {"ndc",	HB_TAG('N','D','C',' ')},	/* Ndau */
   {"nds",	HB_TAG('N','D','S',' ')},	/* Low German/Low Saxon */
   {"ne",	HB_TAG('N','E','P',' ')},	/* Nepali */
   {"new",	HB_TAG('N','E','W',' ')},	/* Newari */
   {"ng",	HB_TAG('N','D','G',' ')},	/* Ndonga */
   {"nga",	HB_TAG('N','G','A',' ')},	/* Ngabaka */
   {"ngl",	HB_TAG('L','M','W',' ')},	/* Lomwe */
+  {"ngo",	HB_TAG('S','X','T',' ')},	/* Sutu */
   {"niu",	HB_TAG('N','I','U',' ')},	/* Niuean */
   {"niv",	HB_TAG('G','I','L',' ')},	/* Gilyak */
   {"nl",	HB_TAG('N','L','D',' ')},	/* Dutch */
   {"nn",	HB_TAG('N','Y','N',' ')},	/* Norwegian Nynorsk */
   {"no",	HB_TAG('N','O','R',' ')},	/* Norwegian [macrolanguage] */
   {"nod",	HB_TAG('N','T','A',' ')},	/* Northern Thai */
   {"noe",	HB_TAG('N','O','E',' ')},	/* Nimadi */
   {"nog",	HB_TAG('N','O','G',' ')},	/* Nogai */
@@ -548,90 +600,104 @@ static const LangTag ot_languages[] = {
   {"nso",	HB_TAG('S','O','T',' ')},	/* [Northern] Sotho */
   {"nv",	HB_TAG('N','A','V',' ')},	/* Navajo */
   {"ny",	HB_TAG('C','H','I',' ')},	/* Chewa/Chichwa/Nyanja */
   {"nym",	HB_TAG('N','Y','M',' ')},	/* Nyamwezi */
   {"nyn",	HB_TAG('N','K','L',' ')},	/* Nyankole */
   {"oc",	HB_TAG('O','C','I',' ')},	/* Occitan (post 1500) */
   {"oj",	HB_TAG('O','J','B',' ')},	/* Ojibwa [macrolanguage] */
   {"ojs",	HB_TAG('O','C','R',' ')},	/* Oji-Cree */
+  {"okm",	HB_TAG('K','O','H',' ')},	/* Korean Old Hangul */
   {"om",	HB_TAG('O','R','O',' ')},	/* Oromo [macrolanguage] */
   {"or",	HB_TAG('O','R','I',' ')},	/* Oriya */
   {"os",	HB_TAG('O','S','S',' ')},	/* Ossetian */
   {"pa",	HB_TAG('P','A','N',' ')},	/* Panjabi */
   {"pag",	HB_TAG('P','A','G',' ')},	/* Pangasinan */
   {"pam",	HB_TAG('P','A','M',' ')},	/* Kapampangan/Pampanga */
-  {"pap",	HB_TAG('P','A','P',' ')},	/* Papiamento */
+  {"pap",	HB_TAG('P','A','P','0')},	/* Papiamento */
+  {"pau",	HB_TAG('P','A','U',' ')},	/* Palauan */
   {"pcc",	HB_TAG('P','C','C',' ')},	/* Bouyei */
   {"pcd",	HB_TAG('P','C','D',' ')},	/* Picard */
   {"pce",	HB_TAG('P','L','G',' ')},	/* [Ruching] Palaung */
   {"pdc",	HB_TAG('P','D','C',' ')},	/* Pennsylvania German */
   {"pes",	HB_TAG('F','A','R',' ')},	/* Iranian Persian */
   {"phk",	HB_TAG('P','H','K',' ')},	/* Phake */
   {"pi",	HB_TAG('P','A','L',' ')},	/* Pali */
   {"pih",	HB_TAG('P','I','H',' ')},	/* Pitcairn-Norfolk */
   {"pl",	HB_TAG('P','L','K',' ')},	/* Polish */
   {"pll",	HB_TAG('P','L','G',' ')},	/* [Shwe] Palaung */
   {"plp",	HB_TAG('P','A','P',' ')},	/* Palpa */
   {"pms",	HB_TAG('P','M','S',' ')},	/* Piemontese */
   {"pnb",	HB_TAG('P','N','B',' ')},	/* Western Panjabi */
+  {"poh",	HB_TAG('P','O','H',' ')},	/* Pocomchi */
+  {"pon",	HB_TAG('P','O','N',' ')},	/* Pohnpeian */
   {"prs",	HB_TAG('D','R','I',' ')},	/* Afghan Persian/Dari */
   {"ps",	HB_TAG('P','A','S',' ')},	/* Pashto/Pushto [macrolanguage] */
   {"pt",	HB_TAG('P','T','G',' ')},	/* Portuguese */
   {"pwo",	HB_TAG('P','W','O',' ')},	/* Pwo Western Karen */
   {"qu",	HB_TAG('Q','U','Z',' ')},	/* Quechua [macrolanguage] */
   {"quc",	HB_TAG('Q','U','C',' ')},	/* K'iche'/Quiché */
+  {"quh",	HB_TAG('Q','U','H',' ')},	/* Quechua (Bolivia) */
   {"quz",	HB_TAG('Q','U','Z',' ')},	/* Cusco Quechua */
+  {"qvi",	HB_TAG('Q','V','I',' ')},	/* Quechua (Ecuador) */
+  {"qwh",	HB_TAG('Q','W','H',' ')},	/* Quechua (Peru) */
   {"raj",	HB_TAG('R','A','J',' ')},	/* Rajasthani [macrolanguage] */
+  {"rar",	HB_TAG('R','A','R',' ')},	/* Rarotongan */
   {"rbb",	HB_TAG('P','L','G',' ')},	/* Rumai Palaung */
   {"rej",	HB_TAG('R','E','J',' ')},	/* Rejang */
   {"ria",	HB_TAG('R','I','A',' ')},	/* Riang (India) */
+  {"rif",	HB_TAG('R','I','F',' ')},	/* Tarifit */
   {"ril",	HB_TAG('R','I','A',' ')},	/* Riang (Myanmar) */
+  {"rit",	HB_TAG('R','I','T',' ')},	/* Ritarungo */
   {"rki",	HB_TAG('A','R','K',' ')},	/* Rakhine */
+  {"rkw",	HB_TAG('R','K','W',' ')},	/* Arakwal */
   {"rm",	HB_TAG('R','M','S',' ')},	/* Romansh */
   {"rmy",	HB_TAG('R','M','Y',' ')},	/* Vlax Romani */
   {"rn",	HB_TAG('R','U','N',' ')},	/* Rundi */
   {"ro",	HB_TAG('R','O','M',' ')},	/* Romanian */
   {"rom",	HB_TAG('R','O','Y',' ')},	/* Romany [macrolanguage] */
+  {"rtm",	HB_TAG('R','T','M',' ')},	/* Rotuman */
   {"ru",	HB_TAG('R','U','S',' ')},	/* Russian */
   {"rue",	HB_TAG('R','S','Y',' ')},	/* Rusyn */
   {"rup",	HB_TAG('R','U','P',' ')},	/* Aromanian/Arumanian/Macedo-Romanian */
   {"rw",	HB_TAG('R','U','A',' ')},	/* Kinyarwanda */
   {"rwr",	HB_TAG('M','A','W',' ')},	/* Marwari (India) */
   {"sa",	HB_TAG('S','A','N',' ')},	/* Sanskrit */
   {"sah",	HB_TAG('Y','A','K',' ')},	/* Yakut */
+  {"sam",	HB_TAG('P','A','A',' ')},	/* Palestinian Aramaic */
   {"sas",	HB_TAG('S','A','S',' ')},	/* Sasak */
   {"sat",	HB_TAG('S','A','T',' ')},	/* Santali */
   {"sc",	HB_TAG('S','R','D',' ')},	/* Sardinian [macrolanguage] */
   {"sck",	HB_TAG('S','A','D',' ')},	/* Sadri */
   {"scn",	HB_TAG('S','C','N',' ')},	/* Sicilian */
   {"sco",	HB_TAG('S','C','O',' ')},	/* Scots */
   {"scs",	HB_TAG('S','L','A',' ')},	/* [North] Slavey */
   {"sd",	HB_TAG('S','N','D',' ')},	/* Sindhi */
   {"se",	HB_TAG('N','S','M',' ')},	/* Northern Sami */
   {"seh",	HB_TAG('S','N','A',' ')},	/* Sena */
   {"sel",	HB_TAG('S','E','L',' ')},	/* Selkup */
   {"sg",	HB_TAG('S','G','O',' ')},	/* Sango */
   {"sga",	HB_TAG('S','G','A',' ')},	/* Old Irish (to 900) */
   {"sgs",	HB_TAG('S','G','S',' ')},	/* Samogitian */
   {"sgw",	HB_TAG('C','H','G',' ')},	/* Sebat Bet Gurage */
 /*{"sgw",	HB_TAG('S','G','W',' ')},*/	/* Sebat Bet Gurage (in SIL fonts) */
+  {"shi",	HB_TAG('S','H','I',' ')},	/* Tachelhit */
   {"shn",	HB_TAG('S','H','N',' ')},	/* Shan */
   {"si",	HB_TAG('S','N','H',' ')},	/* Sinhala */
   {"sid",	HB_TAG('S','I','D',' ')},	/* Sidamo */
   {"sjd",	HB_TAG('K','S','M',' ')},	/* Kildin Sami */
   {"sk",	HB_TAG('S','K','Y',' ')},	/* Slovak */
   {"skr",	HB_TAG('S','R','K',' ')},	/* Seraiki */
   {"sl",	HB_TAG('S','L','V',' ')},	/* Slovenian */
   {"sm",	HB_TAG('S','M','O',' ')},	/* Samoan */
   {"sma",	HB_TAG('S','S','M',' ')},	/* Southern Sami */
   {"smj",	HB_TAG('L','S','M',' ')},	/* Lule Sami */
   {"smn",	HB_TAG('I','S','M',' ')},	/* Inari Sami */
   {"sms",	HB_TAG('S','K','S',' ')},	/* Skolt Sami */
-  {"sn",	HB_TAG('S','N','A',' ')},	/* Shona */
+  {"sn",	HB_TAG('S','N','A','0')},	/* Shona */
   {"snk",	HB_TAG('S','N','K',' ')},	/* Soninke */
   {"so",	HB_TAG('S','M','L',' ')},	/* Somali */
   {"sop",	HB_TAG('S','O','P',' ')},	/* Songe */
   {"sq",	HB_TAG('S','Q','I',' ')},	/* Albanian [macrolanguage] */
   {"sr",	HB_TAG('S','R','B',' ')},	/* Serbian */
   {"srr",	HB_TAG('S','R','R',' ')},	/* Serer */
   {"ss",	HB_TAG('S','W','Z',' ')},	/* Swati */
   {"st",	HB_TAG('S','O','T',' ')},	/* [Southern] Sotho */
@@ -659,30 +725,34 @@ static const LangTag ot_languages[] = {
   {"tet",	HB_TAG('T','E','T',' ')},	/* Tetum */
   {"tg",	HB_TAG('T','A','J',' ')},	/* Tajik */
   {"th",	HB_TAG('T','H','A',' ')},	/* Thai */
   {"ti",	HB_TAG('T','G','Y',' ')},	/* Tigrinya */
   {"tig",	HB_TAG('T','G','R',' ')},	/* Tigre */
   {"tiv",	HB_TAG('T','I','V',' ')},	/* Tiv */
   {"tk",	HB_TAG('T','K','M',' ')},	/* Turkmen */
   {"tl",	HB_TAG('T','G','L',' ')},	/* Tagalog */
-  {"tmh",	HB_TAG('t','m','h',' ')},	/* Tamashek [macrolanguage] */
+  {"tmh",	HB_TAG('T','M','H',' ')},	/* Tamashek */
   {"tn",	HB_TAG('T','N','A',' ')},	/* Tswana */
   {"to",	HB_TAG('T','G','N',' ')},	/* Tonga (Tonga Islands) */
+  {"tod",	HB_TAG('T','O','D','0')},	/* Toma */
+  {"toi",	HB_TAG('T','N','G',' ')},	/* Tonga */
   {"tpi",	HB_TAG('T','P','I',' ')},	/* Tok Pisin */
   {"tr",	HB_TAG('T','R','K',' ')},	/* Turkish */
   {"tru",	HB_TAG('T','U','A',' ')},	/* Turoyo Aramaic */
   {"ts",	HB_TAG('T','S','G',' ')},	/* Tsonga */
   {"tt",	HB_TAG('T','A','T',' ')},	/* Tatar */
   {"tum",	HB_TAG('T','U','M',' ')},	/* Tumbuka */
+  {"tvl",	HB_TAG('T','V','L',' ')},	/* Tuvalu */
   {"tw",	HB_TAG('T','W','I',' ')},	/* Twi */
   {"ty",	HB_TAG('T','H','T',' ')},	/* Tahitian */
   {"tyv",	HB_TAG('T','U','V',' ')},	/* Tuvin */
   {"tyz",	HB_TAG('T','Y','Z',' ')},	/* Tày */
   {"tzm",	HB_TAG('T','Z','M',' ')},	/* Central Atlas Tamazight */
+  {"tzo",	HB_TAG('T','Z','O',' ')},	/* Tzotzil */
   {"udm",	HB_TAG('U','D','M',' ')},	/* Udmurt */
   {"ug",	HB_TAG('U','Y','G',' ')},	/* Uighur */
   {"uk",	HB_TAG('U','K','R',' ')},	/* Ukrainian */
   {"umb",	HB_TAG('U','M','B',' ')},	/* Umbundu */
   {"unr",	HB_TAG('M','U','N',' ')},	/* Mundari */
   {"ur",	HB_TAG('U','R','D',' ')},	/* Urdu */
   {"uz",	HB_TAG('U','Z','B',' ')},	/* Uzbek [macrolanguage] */
   {"uzn",	HB_TAG('U','Z','B',' ')},	/* Northern Uzbek */
@@ -698,91 +768,82 @@ static const LangTag ot_languages[] = {
   {"war",	HB_TAG('W','A','R',' ')},	/* Waray (Philippines) */
   {"wbm",	HB_TAG('W','A',' ',' ')},	/* Wa */
   {"wbr",	HB_TAG('W','A','G',' ')},	/* Wagdi */
   {"wle",	HB_TAG('S','I','G',' ')},	/* Wolane */
   {"wo",	HB_TAG('W','L','F',' ')},	/* Wolof */
   {"wry",	HB_TAG('M','A','W',' ')},	/* Merwari */
   {"wtm",	HB_TAG('W','T','M',' ')},	/* Mewati */
   {"xal",	HB_TAG('K','L','M',' ')},	/* Kalmyk */
+  {"xan",	HB_TAG('S','E','K',' ')},	/* Sekota */
   {"xh",	HB_TAG('X','H','S',' ')},	/* Xhosa */
+  {"xjb",	HB_TAG('X','J','B',' ')},	/* Minjangbal */
   {"xog",	HB_TAG('X','O','G',' ')},	/* Soga */
   {"xom",	HB_TAG('K','M','O',' ')},	/* Komo (Sudan) */
+  {"xpe",	HB_TAG('X','P','E',' ')},	/* Kpelle (Liberia) */
   {"xsl",	HB_TAG('S','S','L',' ')},	/* South Slavey */
   {"xst",	HB_TAG('S','I','G',' ')},	/* Silt'e (retired code) */
   {"xwo",	HB_TAG('T','O','D',' ')},	/* Written Oirat (Todo) */
   {"yao",	HB_TAG('Y','A','O',' ')},	/* Yao */
+  {"yap",	HB_TAG('Y','A','P',' ')},	/* Yapese */
   {"yi",	HB_TAG('J','I','I',' ')},	/* Yiddish [macrolanguage] */
   {"yo",	HB_TAG('Y','B','A',' ')},	/* Yoruba */
   {"yso",	HB_TAG('N','I','S',' ')},	/* Nisi (China) */
   {"za",	HB_TAG('Z','H','A',' ')},	/* Chuang/Zhuang [macrolanguage] */
   {"zea",	HB_TAG('Z','E','A',' ')},	/* Zeeuws */
+  {"zgh",	HB_TAG('Z','G','H',' ')},	/* Standard Morrocan Tamazigh */
   {"zne",	HB_TAG('Z','N','D',' ')},	/* Zande */
   {"zu",	HB_TAG('Z','U','L',' ')}, 	/* Zulu */
-  {"zum",	HB_TAG('L','R','C',' ')}	/* Kumzari */
+  {"zum",	HB_TAG('L','R','C',' ')},	/* Kumzari */
+  {"zza",	HB_TAG('Z','Z','A',' ')},	/* Zazaki */
 
   /* The corresponding languages IDs for the following IDs are unclear,
    * overlap, or are architecturally weird. Needs more research. */
 
-/*{"ahg/awn/xan?",	HB_TAG('A','G','W',' ')},*/	/* Agaw */
-/*{"gsw?/gsw-FR?",	HB_TAG('A','L','S',' ')},*/	/* Alsatian */
+/*{"chp",	HB_TAG('S','A','Y',' ')},*/	/* Sayisi */
+/*{"cwd",	HB_TAG('T','C','R',' ')},*/	/* TH-Cree */
+/*{"emk",	HB_TAG('E','M','K',' ')},*/	/* Eastern Maninkakan */
 /*{"krc",	HB_TAG('B','A','L',' ')},*/	/* Balkar */
 /*{"??",	HB_TAG('B','C','R',' ')},*/	/* Bible Cree */
 /*{"zh?",	HB_TAG('C','H','N',' ')},*/	/* Chinese (seen in Microsoft fonts) */
-/*{"acf/gcf?",	HB_TAG('F','A','N',' ')},*/	/* French Antillean */
-/*{"enf?/yrk?",	HB_TAG('F','N','E',' ')},*/	/* Forest Nenets */
-/*{"fuf?",	HB_TAG('F','T','A',' ')},*/	/* Futa */
 /*{"ar-Syrc?",	HB_TAG('G','A','R',' ')},*/	/* Garshuni */
-/*{"cfm/rnl?",	HB_TAG('H','A','L',' ')},*/	/* Halam */
-/*{"ga-Latg?/Latg?",	HB_TAG('I','R','T',' ')},*/	/* Irish Traditional */
+/*{"hy?",	HB_TAG('H','Y','E','0')},*/	/* Armenian East (ISO 639-3 hye according to Microsoft, but that’s equivalent to ISO 639-1 hy) */
+/*{"ga-Latg?/"	HB_TAG('I','R','T',' ')},*/	/* Irish Traditional */
 /*{"krc",	HB_TAG('K','A','R',' ')},*/	/* Karachay */
-/*{"alw?/ktb?",	HB_TAG('K','E','B',' ')},*/	/* Kebena */
-/*{"Geok",	HB_TAG('K','G','E',' ')},*/	/* Khutsuri Georgian */
+/*{"ka-Geok?",	HB_TAG('K','G','E',' ')},*/	/* Khutsuri Georgian */
 /*{"kca",	HB_TAG('K','H','K',' ')},*/	/* Khanty-Kazim */
 /*{"kca",	HB_TAG('K','H','S',' ')},*/	/* Khanty-Shurishkar */
 /*{"kca",	HB_TAG('K','H','V',' ')},*/	/* Khanty-Vakhi */
-/*{"guz?/kqs?/kss?",	HB_TAG('K','I','S',' ')},*/	/* Kisii */
-/*{"kfa/kfi?/kpb?/xua?/xuj?",	HB_TAG('K','O','D',' ')},*/	/* Kodagu */
-/*{"okm?/oko?",	HB_TAG('K','O','H',' ')},*/	/* Korean Old Hangul */
-/*{"kon?/ktu?/...",	HB_TAG('K','O','N',' ')},*/	/* Kikongo */
-/*{"kfx?",	HB_TAG('K','U','L',' ')},*/	/* Kulvi */
-/*{"??",	HB_TAG('L','A','H',' ')},*/	/* Lahuli */
-/*{"??",	HB_TAG('L','C','R',' ')},*/	/* L-Cree */
+/*{"kqs, kss",	HB_TAG('K','I','S',' ')},*/	/* Kisii */
+/*{"lua",	HB_TAG('L','U','A',' ')},*/	/* Luba-Lulua */
+/*{"mlq",	HB_TAG('M','L','N',' ')},*/	/* Malinke */
+/*{"nso",	HB_TAG('N','S','O',' ')},*/	/* Sotho, Northern */
 /*{"??",	HB_TAG('M','A','L',' ')},*/	/* Malayalam Traditional */
-/*{"mnk?/mlq?/...",	HB_TAG('M','L','N',' ')},*/	/* Malinke */
-/*{"??",	HB_TAG('N','C','R',' ')},*/	/* N-Cree */
-/*{"??",	HB_TAG('N','H','C',' ')},*/	/* Norway House Cree */
-/*{"jpa?/sam?",	HB_TAG('P','A','A',' ')},*/	/* Palestinian Aramaic */
-/*{"polyton",	HB_TAG('P','G','R',' ')},*/	/* Polytonic Greek */
-/*{"??",	HB_TAG('Q','I','N',' ')},*/	/* Asho Chin */
-/*{"??",	HB_TAG('R','C','R',' ')},*/	/* R-Cree */
-/*{"chp?",	HB_TAG('S','A','Y',' ')},*/	/* Sayisi */
-/*{"xan?",	HB_TAG('S','E','K',' ')},*/	/* Sekota */
-/*{"ngo?",	HB_TAG('S','X','T',' ')},*/	/* Sutu */
-/*{"??",	HB_TAG('T','C','R',' ')},*/	/* TH-Cree */
-/*{"tnz?/tog?/toi?",	HB_TAG('T','N','G',' ')},*/	/* Tonga */
-/*{"enh?/yrk?",	HB_TAG('T','N','E',' ')},*/	/* Tundra Nenets */
-/*{"??",	HB_TAG('W','C','R',' ')},*/	/* West-Cree */
-/*{"cre?",	HB_TAG('Y','C','R',' ')},*/	/* Y-Cree */
+/*{"csw",	HB_TAG('N','C','R',' ')},*/	/* N-Cree */
+/*{"csw",	HB_TAG('N','H','C',' ')},*/	/* Norway House Cree */
+/*{"el-polyton",	HB_TAG('P','G','R',' ')},*/	/* Polytonic Greek */
+/*{"bgr, cnh, cnw, czt, sez, tcp, csy, ctd, flm, pck, tcz, zom, cmr, dao, hlt, cka, cnk, mrh, mwg, cbl, cnb, csh",	HB_TAG('Q','I','N',' ')},*/	/* Chin */
 /*{"??",	HB_TAG('Y','I','C',' ')},*/	/* Yi Classic */
-/*{"ii?/Yiii?",	HB_TAG('Y','I','M',' ')},*/	/* Yi Modern */
-/*{"??",	HB_TAG('Z','H','P',' ')},*/	/* Chinese Phonetic */
+/*{"zh-Latn-pinyin",	HB_TAG('Z','H','P',' ')},*/	/* Chinese Phonetic */
 };
 
 typedef struct {
-  char language[8];
+  char language[11];
   hb_tag_t tag;
 } LangTagLong;
 static const LangTagLong ot_languages_zh[] = {
+  /* Store longest-first, if one is a prefix of another. */
   {"zh-cn",	HB_TAG('Z','H','S',' ')},	/* Chinese (China) */
   {"zh-hk",	HB_TAG('Z','H','H',' ')},	/* Chinese (Hong Kong) */
-  {"zh-mo",	HB_TAG('Z','H','T',' ')},	/* Chinese (Macao) */
+  {"zh-mo",	HB_TAG('Z','H','H',' ')},	/* Chinese (Macao) */
   {"zh-sg",	HB_TAG('Z','H','S',' ')},	/* Chinese (Singapore) */
   {"zh-tw",	HB_TAG('Z','H','T',' ')},	/* Chinese (Taiwan) */
   {"zh-hans",	HB_TAG('Z','H','S',' ')},	/* Chinese (Simplified) */
+  {"zh-hant-hk",HB_TAG('Z','H','H',' ')},	/* Chinese (Hong Kong) */
+  {"zh-hant-mo",HB_TAG('Z','H','H',' ')},	/* Chinese (Macao) */
   {"zh-hant",	HB_TAG('Z','H','T',' ')},	/* Chinese (Traditional) */
 };
 
 static int
 lang_compare_first_component (const char *a,
 			      const char *b)
 {
   unsigned int da, db;
@@ -826,23 +887,31 @@ hb_ot_tag_from_language (hb_language_t l
     if (i) {
       for (; i < 4; i++)
 	tag[i] = ' ';
       return HB_TAG_CHAR4 (tag);
     }
   }
 
   /*
-   * The International Phonetic Alphabet is a variant tag in BCP-47,
-   * which can be applied to any language.
+   * "fonipa" is a variant tag in BCP-47, meaning the International Phonetic Alphabet.
+   * It can be applied to any language.
    */
   if (strstr (lang_str, "-fonipa")) {
     return HB_TAG('I','P','P','H');  /* Phonetic transcription—IPA conventions */
   }
 
+  /*
+   * "fonnapa" is a variant tag in BCP-47, meaning the North American Phonetic Alphabet
+   * also known as Americanist Phonetic Notation.  It can be applied to any language.
+   */
+  if (strstr (lang_str, "-fonnapa")) {
+    return HB_TAG('A','P','P','H');  /* Phonetic transcription—Americanist conventions */
+  }
+
   /* Find a language matching in the first component */
   {
     const LangTag *lang_tag;
     lang_tag = (LangTag *) bsearch (lang_str, ot_languages,
 				    ARRAY_LENGTH (ot_languages), sizeof (LangTag),
 				    (hb_compare_func_t) lang_compare_first_component);
     if (lang_tag)
       return lang_tag->tag;
@@ -904,16 +973,18 @@ hb_ot_tag_to_language (hb_tag_t tag)
       case HB_TAG('Z','H','S',' '): return hb_language_from_string ("zh-Hans", -1); /* Simplified */
       case HB_TAG('Z','H','T',' '): return hb_language_from_string ("zh-Hant", -1); /* Traditional */
       default: break; /* Fall through */
     }
   }
 
   /* struct LangTag has only room for 3-letter language tags. */
   switch (tag) {
+  case HB_TAG('A','P','P','H'):  /* Phonetic transcription—Americanist conventions */
+    return hb_language_from_string ("und-fonnapa", -1);
   case HB_TAG('I','P','P','H'):  /* Phonetic transcription—IPA conventions */
     return hb_language_from_string ("und-fonipa", -1);
   }
 
   /* Else return a custom language in the form of "x-hbotABCD" */
   {
     unsigned char buf[11] = "x-hbot";
     buf[6] = tag >> 24;
--- a/gfx/harfbuzz/src/hb-private.hh
+++ b/gfx/harfbuzz/src/hb-private.hh
@@ -78,17 +78,17 @@ extern "C" void  hb_free_impl(void *ptr)
 #define _HB_BOOLEAN_EXPR(expr) ((expr) ? 1 : 0)
 #define likely(expr) (__builtin_expect (_HB_BOOLEAN_EXPR(expr), 1))
 #define unlikely(expr) (__builtin_expect (_HB_BOOLEAN_EXPR(expr), 0))
 #else
 #define likely(expr) (expr)
 #define unlikely(expr) (expr)
 #endif
 
-#ifndef __GNUC__
+#if !defined(__GNUC__) && !defined(__clang__)
 #undef __attribute__
 #define __attribute__(x)
 #endif
 
 #if __GNUC__ >= 3
 #define HB_PURE_FUNC	__attribute__((pure))
 #define HB_CONST_FUNC	__attribute__((const))
 #define HB_PRINTF_FUNC(format_idx, arg_idx) __attribute__((__format__ (__printf__, format_idx, arg_idx)))
@@ -164,16 +164,17 @@ extern "C" void  hb_free_impl(void *ptr)
 #  endif
 #  ifndef STRICT
 #    define STRICT 1
 #  endif
 
 #  if defined(_WIN32_WCE)
      /* Some things not defined on Windows CE. */
 #    define strdup _strdup
+#    define vsnprintf _vsnprintf
 #    define getenv(Name) NULL
 #    if _WIN32_WCE < 0x800
 #      define setlocale(Category, Locale) "C"
 static int errno = 0; /* Use something better? */
 #    endif
 #  elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
 #    define getenv(Name) NULL
 #  endif
--- a/gfx/harfbuzz/src/hb-set-private.hh
+++ b/gfx/harfbuzz/src/hb-set-private.hh
@@ -308,26 +308,26 @@ struct hb_set_t
       count += _hb_popcount32 (elts[i]);
     return count;
   }
   inline hb_codepoint_t get_min (void) const
   {
     for (unsigned int i = 0; i < ELTS; i++)
       if (elts[i])
 	for (unsigned int j = 0; j < BITS; j++)
-	  if (elts[i] & (1 << j))
+	  if (elts[i] & (1u << j))
 	    return i * BITS + j;
     return INVALID;
   }
   inline hb_codepoint_t get_max (void) const
   {
     for (unsigned int i = ELTS; i; i--)
       if (elts[i - 1])
 	for (unsigned int j = BITS; j; j--)
-	  if (elts[i - 1] & (1 << (j - 1)))
+	  if (elts[i - 1] & (1u << (j - 1)))
 	    return (i - 1) * BITS + (j - 1);
     return INVALID;
   }
 
   typedef uint32_t elt_t;
   static const unsigned int MAX_G = 65536 - 1; /* XXX Fix this... */
   static const unsigned int SHIFT = 5;
   static const unsigned int BITS = (1 << SHIFT);
--- a/gfx/harfbuzz/src/hb-shape.cc
+++ b/gfx/harfbuzz/src/hb-shape.cc
@@ -389,18 +389,16 @@ hb_shape_full (hb_font_t          *font,
  * @features: (array length=num_features) (allow-none): an array of user
  *    specified #hb_feature_t or %NULL
  * @num_features: the length of @features array
  *
  * Shapes @buffer using @font turning its Unicode characters content to
  * positioned glyphs. If @features is not %NULL, it will be used to control the
  * features applied during shaping.
  *
- * Return value: %FALSE if all shapers failed, %TRUE otherwise
- *
  * Since: 0.9.2
  **/
 void
 hb_shape (hb_font_t           *font,
 	  hb_buffer_t         *buffer,
 	  const hb_feature_t  *features,
 	  unsigned int         num_features)
 {
--- a/gfx/harfbuzz/src/hb-ucdn.cc
+++ b/gfx/harfbuzz/src/hb-ucdn.cc
@@ -149,16 +149,22 @@ static const hb_script_t ucdn_script_tra
     HB_SCRIPT_TIRHUTA,
     HB_SCRIPT_WARANG_CITI,
     HB_SCRIPT_AHOM,
     HB_SCRIPT_ANATOLIAN_HIEROGLYPHS,
     HB_SCRIPT_HATRAN,
     HB_SCRIPT_MULTANI,
     HB_SCRIPT_OLD_HUNGARIAN,
     HB_SCRIPT_SIGNWRITING,
+    HB_SCRIPT_ADLAM,
+    HB_SCRIPT_BHAIKSUKI,
+    HB_SCRIPT_MARCHEN,
+    HB_SCRIPT_NEWA,
+    HB_SCRIPT_OSAGE,
+    HB_SCRIPT_TANGUT,
 };
 
 static hb_unicode_combining_class_t
 hb_ucdn_combining_class(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode,
 			void *user_data HB_UNUSED)
 {
     return (hb_unicode_combining_class_t) ucdn_get_combining_class(unicode);
 }
--- a/gfx/harfbuzz/src/hb-unicode-private.hh
+++ b/gfx/harfbuzz/src/hb-unicode-private.hh
@@ -110,16 +110,18 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIM
 
     /* XXX This hack belongs to the SEA shaper (for Tai Tham):
      * Reorder SAKOT to ensure it comes after any tone marks. */
     if (unlikely (unicode == 0x1A60u)) return 254;
 
     /* XXX This hack belongs to the Tibetan shaper:
      * Reorder PADMA to ensure it comes after any vowel marks. */
     if (unlikely (unicode == 0x0FC6u)) return 254;
+    /* Reorder TSA -PHRU to reorder before U+0F74 */
+    if (unlikely (unicode == 0x0F39u)) return 127;
 
     return _hb_modified_combining_class[combining_class (unicode)];
   }
 
   static inline hb_bool_t
   is_variation_selector (hb_codepoint_t unicode)
   {
     /* U+180B..180D MONGOLIAN FREE VARIATION SELECTORs are handled in the
@@ -175,18 +177,18 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIM
       hb_codepoint_t page = ch >> 8;
       switch (page) {
 	case 0x00: return unlikely (ch == 0x00ADu);
 	case 0x03: return unlikely (ch == 0x034Fu);
 	case 0x06: return unlikely (ch == 0x061Cu);
 	case 0x17: return hb_in_range (ch, 0x17B4u, 0x17B5u);
 	case 0x18: return hb_in_range (ch, 0x180Bu, 0x180Eu);
 	case 0x20: return hb_in_ranges (ch, 0x200Bu, 0x200Fu,
-							    0x202Au, 0x202Eu,
-							    0x2060u, 0x206Fu);
+					    0x202Au, 0x202Eu,
+					    0x2060u, 0x206Fu);
 	case 0xFE: return hb_in_range (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu;
 	case 0xFF: return hb_in_range (ch, 0xFFF0u, 0xFFF8u);
 	default: return false;
       }
     }
     else
     {
       /* Other planes */
@@ -338,20 +340,22 @@ extern HB_INTERNAL const hb_unicode_func
  */
 #define HB_MODIFIED_COMBINING_CLASS_CCC103 3 /* sara u / sara uu */
 #define HB_MODIFIED_COMBINING_CLASS_CCC107 107 /* mai * */
 
 /* Lao */
 #define HB_MODIFIED_COMBINING_CLASS_CCC118 118 /* sign u / sign uu */
 #define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */
 
-/* Tibetan */
+/* Tibetan
+ * Modify U+0F74 (ccc=132) to reorder before ccc=130 marks.
+ */
 #define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */
 #define HB_MODIFIED_COMBINING_CLASS_CCC130 130 /* sign i */
-#define HB_MODIFIED_COMBINING_CLASS_CCC132 132 /* sign u */
+#define HB_MODIFIED_COMBINING_CLASS_CCC132 128 /* sign u */
 
 
 /* Misc */
 
 #define HB_UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat) \
 	(FLAG_SAFE (gen_cat) & \
 	 (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
 	  FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
--- a/gfx/harfbuzz/src/hb-unicode.h
+++ b/gfx/harfbuzz/src/hb-unicode.h
@@ -444,43 +444,28 @@ hb_unicode_mirroring (hb_unicode_funcs_t
  * hb_unicode_script:
  *
  * Since: 0.9.2
  **/
 HB_EXTERN hb_script_t
 hb_unicode_script (hb_unicode_funcs_t *ufuncs,
 		   hb_codepoint_t unicode);
 
-/**
- * hb_unicode_compose:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN hb_bool_t
 hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
 		    hb_codepoint_t      a,
 		    hb_codepoint_t      b,
 		    hb_codepoint_t     *ab);
 
-/**
- * hb_unicode_decompose:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN hb_bool_t
 hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
 		      hb_codepoint_t      ab,
 		      hb_codepoint_t     *a,
 		      hb_codepoint_t     *b);
 
-/**
- * hb_unicode_decompose_compatibility:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN unsigned int
 hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
 				    hb_codepoint_t      u,
 				    hb_codepoint_t     *decomposed);
 
 HB_END_DECLS
 
 #endif /* HB_UNICODE_H */
--- a/gfx/harfbuzz/src/hb-uniscribe.cc
+++ b/gfx/harfbuzz/src/hb-uniscribe.cc
@@ -766,17 +766,17 @@ retry:
     hb_codepoint_t c = buffer->info[i].codepoint;
     buffer->info[i].utf16_index() = chars_len;
     if (likely (c <= 0xFFFFu))
       pchars[chars_len++] = c;
     else if (unlikely (c > 0x10FFFFu))
       pchars[chars_len++] = 0xFFFDu;
     else {
       pchars[chars_len++] = 0xD800u + ((c - 0x10000u) >> 10);
-      pchars[chars_len++] = 0xDC00u + ((c - 0x10000u) & ((1 << 10) - 1));
+      pchars[chars_len++] = 0xDC00u + ((c - 0x10000u) & ((1u << 10) - 1));
     }
   }
 
   ALLOCATE_ARRAY (WORD, log_clusters, chars_len);
   ALLOCATE_ARRAY (SCRIPT_CHARPROP, char_props, chars_len);
 
   if (num_features)
   {
@@ -822,17 +822,17 @@ retry:
   SCRIPT_ITEM items[MAX_ITEMS + 1];
   SCRIPT_CONTROL bidi_control = {0};
   SCRIPT_STATE bidi_state = {0};
   ULONG script_tags[MAX_ITEMS];
   int item_count;
 
   /* MinGW32 doesn't define fMergeNeutralItems, so we bruteforce */
   //bidi_control.fMergeNeutralItems = true;
-  *(uint32_t*)&bidi_control |= 1<<24;
+  *(uint32_t*)&bidi_control |= 1u<<24;
 
   bidi_state.uBidiLevel = HB_DIRECTION_IS_FORWARD (buffer->props.direction) ? 0 : 1;
   bidi_state.fOverrideDirection = 1;
 
   hr = funcs->ScriptItemizeOpenType (pchars,
 				     chars_len,
 				     MAX_ITEMS,
 				     &bidi_control,
--- a/gfx/harfbuzz/src/hb-version.h
+++ b/gfx/harfbuzz/src/hb-version.h
@@ -32,20 +32,20 @@
 #define HB_VERSION_H
 
 #include "hb-common.h"
 
 HB_BEGIN_DECLS
 
 
 #define HB_VERSION_MAJOR 1
-#define HB_VERSION_MINOR 2
-#define HB_VERSION_MICRO 6
+#define HB_VERSION_MINOR 3
+#define HB_VERSION_MICRO 0
 
-#define HB_VERSION_STRING "1.2.6"
+#define HB_VERSION_STRING "1.3.0"
 
 #define HB_VERSION_ATLEAST(major,minor,micro) \
 	((major)*10000+(minor)*100+(micro) <= \
 	 HB_VERSION_MAJOR*10000+HB_VERSION_MINOR*100+HB_VERSION_MICRO)
 
 
 HB_EXTERN void
 hb_version (unsigned int *major,
--- a/gfx/harfbuzz/src/sample.py
+++ b/gfx/harfbuzz/src/sample.py
@@ -1,13 +1,14 @@
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 
 from __future__ import print_function
 import sys
+import array
 from gi.repository import HarfBuzz as hb
 from gi.repository import GLib
 
 # Python 2/3 compatibility
 try:
 	unicode
 except NameError:
 	unicode = str
@@ -34,17 +35,36 @@ hb.ot_font_set_funcs (font)
 
 buf = hb.buffer_create ()
 class Debugger(object):
 	def message (self, buf, font, msg, data, _x_what_is_this):
 		print(msg)
 		return True
 debugger = Debugger()
 hb.buffer_set_message_func (buf, debugger.message, 1, 0)
-hb.buffer_add_utf8 (buf, text.encode('utf-8'), 0, -1)
+
+##
+## Add text to buffer
+##
+#
+# See https://github.com/behdad/harfbuzz/pull/271
+#
+if False:
+	# If you do not care about cluster values reflecting Python
+	# string indices, then this is quickest way to add text to
+	# buffer:
+	hb.buffer_add_utf8 (buf, text.encode('utf-8'), 0, -1)
+	# Otherwise, then following handles both narrow and wide
+	# Python builds:
+elif sys.maxunicode == 0x10FFFF:
+	hb.buffer_add_utf32 (buf, array.array('I', text.encode('utf-32')), 0, -1)
+else:
+	hb.buffer_add_utf16 (buf, array.array('H', text.encode('utf-16')), 0, -1)
+
+
 hb.buffer_guess_segment_properties (buf)
 
 hb.shape (font, buf, [])
 del font
 
 infos = hb.buffer_get_glyph_infos (buf)
 positions = hb.buffer_get_glyph_positions (buf)